Sql-Server

在 SQL Server 中為兩個不同的“插入後”觸發器設置優先級

  • January 10, 2018

我正在嘗試按功能創建觸發器,而不是 DML 操作。

對於 exp,我有 2 個觸發器 A 和 B。A 用於“ AFTER insert, update, DELETE ”,B 用於“ AFTER INSERT ”。插入新記錄後,如何知道哪個(A 或 B)先執行?

您可以使用 指定要觸發的第一個和/或最後一個觸發器sys.sp_settriggerorder。如果您有兩個或三個觸發器,這可以讓您完全控制所有觸發器的執行順序。如果你有超過三個,你可以先做一個,最後一個,但是中間觸發器的執行順序是不確定的。

在您的情況下,要確保A始終首先觸發:

EXEC sys.sp_settriggerorder N'dbo.A', 'First', 'INSERT';

為了確保B總是最後觸發(雖然當只有兩個觸發器時沒有必要,您可以稍後添加更多,請注意,如果您稍後嘗試將另一個觸發器指定為最後一個,它將產生錯誤):

EXEC sys.sp_settriggerorder N'dbo.B', 'Last', 'INSERT';

如果您不是在詢問如何控制訂單,而是在事後確定哪個是針對特定插入首先觸發的,那麼您將必須向兩個觸發器添加日誌記錄。將兩個觸發器的活動記錄到表中後,您可以通過記錄表上的標識列或填充目前時間的日期/時間列來確定順序。

當然,您最好將兩個觸發器組合為一個(並且僅插入的部分將具有條件邏輯)。我沒有測試插入/更新/刪除觸發器中的附加插入邏輯的成本在被刪除或更新操作呼叫時被繞過,但總的來說,我的測試得出結論,即使最終結果是單個觸發器的成本也比多個觸發器少影響相同的行數:

引用自:https://dba.stackexchange.com/questions/128217