SQL server 數(shù)據(jù)庫指定第一個與最后一個觸發(fā)器的方案
以下的文章主要向大家講述的是SQL server 數(shù)據(jù)庫如何正確指定***個觸發(fā)器與***一個觸發(fā)器的實際操作方案,其具體的操作方案可以將和表相關(guān)聯(lián)的 AFTER 觸發(fā)器之一指定為每個 INSERT、DELETE 和 UPDATE 觸發(fā)動作執(zhí)行的***個或***一個 AFTER 觸發(fā)器。
在***個和***一個觸發(fā)器之間激發(fā)的 AFTER 觸發(fā)器將按未定義的順序執(zhí)行。
若要指定 AFTER 觸發(fā)器的順序,請使用 sp_settriggerorder 存儲過程??捎玫倪x項有:
***個
SQL server 數(shù)據(jù)庫指定該觸發(fā)器是為觸發(fā)操作激發(fā)的***個 AFTER 觸發(fā)器。
***一個
指定該觸發(fā)器是為觸發(fā)操作激發(fā)的***一個 AFTER 觸發(fā)器。
無
指定觸發(fā)器的激發(fā)沒有特定的順序。主要用于重新設(shè)置***個或***一個觸發(fā)器。
以下是使用 sp_settriggerorder 的示例:
- sp_settriggerorder @triggername = 'MyTrigger', @order = 'first', @stmttype = 'UPDATE'
重要 ***個和***一個觸發(fā)器必須是兩個不同的觸發(fā)器。
可能同時在表上定義了 INSERT、UPDATE 和 DELETE 觸發(fā)器。每種語句類型可能都有自己的***個和***一個觸發(fā)器,但它們不能是相同的觸發(fā)器。
如果為某個表定義的***個或***一個觸發(fā)器不包括觸發(fā)操作,如 FOR UPDATE、FOR DELETE 或 FOR INSERT,則缺少的操作將沒有***個或***一個觸發(fā)器。
不能將 INSTEAD OF 觸發(fā)器SQL server 數(shù)據(jù)庫指定為***個或***一個觸發(fā)器。在對基礎(chǔ)表進行更新前激發(fā) INSTEAD OF 觸發(fā)器。然而,如果由 INSTEAD OF 觸發(fā)器對基礎(chǔ)表進行更新,則這些更新將發(fā)生于在表上定義觸發(fā)器(包括***個觸發(fā)器)之后。
例如,如果視圖上的 INSTEAD OF 觸發(fā)器更新基表并且該基表包含三個觸發(fā)器,則該三個觸發(fā)器在 INSTEAD OF 觸發(fā)器插入數(shù)據(jù)之前激發(fā)。有關(guān)更多信息,請參見SQL server 數(shù)據(jù)庫指定觸發(fā)器何時激發(fā)。
如果 ALTER TRIGGER 語句更改了***個或***一個觸發(fā)器,則將除去 First 或 Last 特性,并且順序值將設(shè)置為 None;必須用 sp_settriggerorder 重置此順序。
OBJECTPROPERTY 函數(shù)使用屬性 ExecIsFirstTrigger 和 ExecIsLastTrigger 報告觸發(fā)器的順序是***個還是***一個。
復(fù)制將為本身是即時更新訂戶或排隊更新訂戶的任何表自動生成***個觸發(fā)器。復(fù)制要求它的觸發(fā)器是***個觸發(fā)器。如果嘗試使具有***個觸發(fā)器的表成為即時更新訂戶或排隊更新訂戶,復(fù)制將引發(fā)錯誤。如果使表成為即時更新訂戶或排隊更新訂戶之后使用戶定義觸發(fā)器成為***個觸發(fā)器,則 sp_settriggerorder 會返回一個錯誤。
如果在復(fù)制觸發(fā)器上使用 ALTER,或使用 sp_settriggerorder 將復(fù)制觸發(fā)器更改為***觸發(fā)器或無觸發(fā)器,則訂閱將不能正確工作。
【編輯推薦】