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