指定第一個和最後一個觸發程序

您可以指定與資料表關聯的其中一個 AFTER 觸發程序,做為針對每一個 INSERT、DELETE 和 UPDATE 觸發動作而引發的第一個或最後一個 AFTER 觸發程序。在第一個及最後一個觸發程序之間啟動的 AFTER 觸發程序,會以未定義的順序執行。

若要指定 AFTER 觸發程序的順序,請使用 sp_settriggerorder 預存程序。sp_settriggerorder 具有下列選項。

選項

描述

First

指定 DML 觸發程序為針對觸發動作而引發的第一個 AFTER 觸發程序。

Last

指定 DML 觸發程序為針對觸發動作而引發的最後一個 AFTER 觸發程序。

指定 DML 觸發程序的引發並無特定的順序。主要用來重設第一個或最後一個觸發程序。

以下範例顯示如何使用 sp_settriggerorder

sp_settriggerorder @triggername = 'MyTrigger', @order = 'first', @stmttype = 'UPDATE'
重要事項重要事項

第一個及最後一個觸發程序,必須是兩個不同的 DML 觸發程序。

可以同時對一個資料表定義 INSERT、UPDATE 及 DELETE 等觸發程序。每個陳述式類型都可以擁有它自己的第一個及最後一個觸發程序,但它們不得為相同的觸發程序。

如果針對某資料表定義的第一個或最後一個觸發程序並不涵蓋觸發動作,例如未涵蓋 FOR UPDATE、FOR DELETE 或 FOR INSERT,則遺漏的動作不會有第一個或最後一個觸發程序。

INSTEAD OF 觸發程序不得被指定為第一個或最後一個觸發程序。INSTEAD OF 觸發程序必須在更新基礎資料表之前啟動。如果是由 INSTEAD OF 觸發程序更新基礎資料表,則更新會發生在引發對資料表定義的 AFTER 觸發程序之前。例如,如果在檢視上的 INSTEAD OF INSERT 觸發程序將資料插入基底資料表,而基底資料表本身包含 INSTEAD OF INSERT 觸發程序和三個 AFTER INSERT 觸發程序,就會引發基底資料表上的 INSTEAD OF INSERT 觸發程序,而不是插入動作,而且在基底資料表上的任何插入動作之後,都會引發基底資料表的 AFTER 觸發程序。如需詳細資訊,請參閱<指定 DML 觸發程序引發的時機>。

如果 ALTER TRIGGER 陳述式變更第一個或最後一個觸發程序,則會捨棄 FirstLast 屬性,並且將順序值設為 None。順序必須使用 sp_settriggerorder 重新設定。

OBJECTPROPERTY 函數也會利用 ExecIsFirstTriggerExecIsLastTrigger 屬性,來報告觸發程序究竟是第一個或最後一個觸發程序。

複寫會為包含在即時更新或佇列式更新訂閱的資料表,自動產生第一個觸發程序。複寫會要求它的觸發程序為第一個觸發程序。如果您嘗試在即時或佇列更新訂閱中包含擁有第一個觸發程序的資料表,複寫將引發錯誤。如果您嘗試在資料表已加入訂閱後,將觸發程序變成第一個觸發程序,則 sp_settriggerorder 會傳回錯誤。如果您對複寫觸發程序使用 ALTER,或使用 sp_settriggerorder 將複寫觸發程序變更為最後一個或無觸發程序,則訂閱將無法正常運作。