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

適用於:SQL ServerAzure SQL DatabaseAzure SQL 受控執行個體Microsoft Fabric 中的 SQL 資料庫

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

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

選項 描述
第一個 指定 DML 觸發程序是針對某個觸發動作最先引發的 AFTER 觸發程序。
最後一個 指定 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 Triggers。

如果語ALTER TRIGGER句改變了第一個或最後一個觸發點,第一個或最後一個屬性會被丟棄,順序值則設為 None。 順序必須使用 sp_settriggerorder進行重設。

OBJECTPROPERTY 函式會使用下列屬性來報告觸發程式是否為第一個或最後一個觸發程式:ExecIsFirstInsertTrigger、ExecIsFirstUpdateTrigger、ExecIsFirstDeleteTrigger、ExecIsLastInsertTrigger、ExecIsLastUpdateTrigger和 ExecIsLastDeleteTrigger。

複寫會自動為任何包含於即時更新或佇列式更新訂閱中的資料表產生第一個觸發程序。 複寫要求其觸發程序必須是第一個觸發程序。 當您嘗試將含有第一個觸發程序的資料表包括在立即更新或佇列更新訂閱中,複寫會引發錯誤。 如果您嘗試在資料表已納入訂閱之後,將某個觸發程序設為第一個觸發程序,則 sp_settriggerorder 會傳回錯誤。 如果您對複寫觸發程序使用 ALTER,或使用 sp_settriggerorder 將複寫觸發程序變更為最後一個或無觸發程序,則訂閱將無法正常運作。