共用方式為


DML 觸發程序執行

發生強制違規時絕對不會執行 AFTER 觸發程序,所以,這些觸發程序無法用於可能妨礙強制違規的任何處理動作。

INSTEAD OF 觸發程序可替代觸發動作執行。這些觸發程序的執行順序是在建立反映基底資料表變更的 inserteddeleted 資料表之後、但在其他動作之前。它們會在任何條件約束之前執行,因此可以執行輔助條件約束動作的前置處理。

如果資料表所定義的 INSTEAD OF 觸發程序對資料表執行陳述式時,通常會再次啟動 INSTEAD OF 觸發程序,就不會遞迴呼叫該觸發程序。而是會以資料表沒有 INSTEAD OF 觸發程序的方式來處理陳述式,並啟動條件約束作業及 AFTER 觸發程序執行的鏈結。例如,如果將 DML 觸發程序定義為資料表的 INSTEAD OF INSERT 觸發程序,且觸發程序在相同的資料表上執行 INSERT 陳述式,那麼 INSTEAD OF 觸發程序所執行的 INSERT 陳述式將不會再次呼叫觸發程序。觸發程序所執行的 INSERT 會啟動執行條件約束動作及引發定義給資料表之任何 AFTER INSERT 觸發程序的程序。

如果檢視所定義的 INSTEAD OF 觸發程序對檢視執行陳述式時,通常會再次啟動 INSTEAD OF 觸發程序,就不會遞迴呼叫該觸發程序。相反地,陳述式會解析成針對檢視下的基底資料表來進行的修改。在這種情況下,檢視定義必須符合可更新檢視的所有限制。如需可更新之檢視的定義,請參閱<透過檢視修改資料>。例如,如果將 DML 觸發程序定義為檢視的 INSTEAD OF UPDATE 觸發程序,且讓觸發程序執行一個參照相同檢視的 UPDATE 陳述式,那麼 INSTEAD OF 觸發程序所執行的 UPDATE 陳述式將不會再次呼叫觸發程序。觸發程序所執行的 UPDATE 是依照檢視沒有 INSTEAD OF 觸發程序的方式,針對檢視來處理的。UPDATE 所變更的資料行必須解析成單一基底資料表。基礎基底資料表的每項修改都會啟動套用條件約束及引發定義給資料表之 AFTER 觸發程序的鏈結。

DML 觸發程序的效能負擔通常不高。執行 DML 觸發程序的時間大部分花費在參考其他資料表上,這些資料表可能在記憶體中或資料庫裝置上。deletedinserted 的資料表永遠都在記憶體中。觸發程序所參考的其他資料表的位置,將決定作業所需的時間。

[!附註]

不建議在 DML 觸發程序中使用資料指標,因為這麼做可能會對效能造成負面的影響。請使用資料列集式的邏輯來設計影響多個資料列的 DML 觸發程序,而不要使用資料指標。

DML 觸發程序執行和資料分割檢視

UPDATE 和 DELETE 觸發程序在資料分割檢視的基礎資料表上引發的方式已經變更,與它們在 SQL Server 2000 中引發的方式不同。在 SQL Server 2000 中,對資料分割檢視發出 UPDATE 或 DELETE 陳述式時,不論是本機或分散式,凡是在該檢視的基底資料表上定義的任何 UPDATE 或 DELETE 觸發程序都會引發。這些包括不受更新或刪除作業影響之資料表上的觸發程序。在 SQL Server 2008 和 SQL Server 2005中,唯有當定義觸發程序的基底資料表受到更新或刪除作業影響時,UPDATE 或 DELETE 觸發程序才會引發。AFTER 和 INSTEAD OF 觸發程序的這個行為相同。

例如,假設有一個資料分割檢視 PV,它是由資料表 T1T2 的欄位所組成。另外,T1T2 上也定義了 UPDATE 觸發程序。在 SQL Server 2000 中,對 PV 發出的 UPDATE 陳述式 (它只影響 T1 中的資料列) 會造成 T1T2 上的 UPDATE 觸發程序引發。在 SQL Server 2008 和 SQL Server 2005 中,只有定義在 T1 上的 UPDATE 觸發程序才會引發。

下表是行為變更的摘要。

對本機資料分割檢視的插入、更新或刪除作業

 

SQL Server 2000

目前版本

INSERT TRIGGER

只在受影響的資料表上引發。

只在受影響的資料表上引發。

UPDATE TRIGGER

對於定義了此種觸發程序的資料分割檢視的所有基礎資料表引發。

只在受影響的資料表上引發。

DELETE TRIGGER

對於定義了此種觸發程序的資料分割檢視的所有基礎資料表引發。

只在受影響的資料表上引發。

對分散式資料分割檢視的插入、更新或刪除作業

 

SQL Server 2000

目前版本

INSERT TRIGGER

只在分散式資料分割檢視的受影響資料表上引發。如果本機執行個體和遠端執行個體的資料表受到影響,則資料表上所定義的觸發程序會引發。

只在分散式資料分割檢視的受影響資料表上引發。如果本機執行個體和遠端執行個體的資料表受到影響,則資料表上所定義的觸發程序會引發。

UPDATE TRIGGER

對於定義了此種觸發程序的資料分割檢視的所有基礎資料表引發。

對於定義了此種觸發程序的遠端執行個體上的所有資料表引發。只在本機執行個體上受影響的資料表上引發。

DELETE TRIGGER

對於定義了此種觸發程序的資料分割檢視的所有基礎資料表引發。

對於定義了此種觸發程序的遠端執行個體上的所有資料表引發。只在本機執行個體上受影響的資料表上引發。