回答
訂單由sql server設置,您可以做的唯一的事情就是使用系統sp(sp_settriggerorder)來設置哪個觸發器會首先觸發,哪個觸發器會最後觸發。
除了設置要觸發的第一個和最後一個觸發器之外,您不能修改或判斷sql server將使用哪個順序。因此,您需要構建觸發器,以便它們不依賴於它們被觸發的順序。即使你確定今天的命令,它明天可能會改變。
此信息基於Sql Server 2000,但我不認爲2005/2008在這方面的行爲不同。
使用sp_Settriggerorder
存儲過程,可以定義觸發器的執行順序。
sp_settriggerorder [ @triggername = ] ‘[ triggerschema. ] triggername’
, [ @order = ] ‘value’
, [ @stmttype = ] ’statement_type’
[ , [ @namespace = ] { ‘DATABASE’ | ‘SERVER’ | NULL } ]
第二個參數「order」可以取三個值,這意味着它可以考慮最多三個觸發器。
- 首先 - 觸發首先被燒成
- 最後 - 激活觸發器最後
- 無 - 觸發以隨機順序發射。
使用此係統存儲過程:
sp_settriggerorder[@triggername = ] 'triggername', [@order = ] 'value', [@stmttype = ] 'statement_type'
sp_settriggerorder僅適用於AFTER觸發器。
您可以確保首先觸發哪個觸發器,哪個觸發器最後觸發,哪些觸發器使用sp_settriggerorder在中間觸發。如果您需要同步三個以上,它不會出現在SQL Server 2005中。
這是一個取自here的示例(鏈接的文章有更多信息)。
sp_settriggerorder [ @triggername = ] ‘[ triggerschema. ] triggername’
, [ @order = ] ‘value’
, [ @stmttype = ] ’statement_type’
[ , [ @namespace = ] { ‘DATABASE’ | ‘SERVER’ | NULL } ]
如果你在擔心觸發訂單,那麼你真的應該採取一種倒退,並考慮你正在嘗試做的,如果有這樣做的更好的辦法的地步。事實上,這不是一件容易改變的事情,應該告訴你一些事情。
觸發器總是看起來像一個真正整潔的解決方案,並在正確的地方,他們是非常寶貴的,但價格高,它真的很容易與他們創造的調試噩夢。過去我失去了許多小時,試圖調試一些模糊的數據庫行爲,只是爲了找到原因被忽略的觸發器。
使用SetTriggerOrder是好的,但如果你的代碼依賴於執行的特定序列,爲什麼不是所有的觸發器包裝到存儲過程,並有第一個撥打第二個,第二個叫第三等
然後你只需要在觸發器中執行第一個。
有人將來會很感激他們不需要在系統表中挖掘來確定自定義執行順序。
您可以使用sp_settriggerorder來定義表上每個觸發器的順序。
但是,我會爭辯說,有一個觸發器可以處理多種事情,會更好。這是,特別是所以如果順序很重要,因爲如果你有多個觸發器,那麼重要性就不會很明顯。想象一下,有人試圖在賽道上支持數據庫月/年。當然,可能會出現這種情況,你需要有多個觸發器,或者它確實是更好的設計,但我會開始假設你應該有一個並從那裏開始工作。
這方面的一個百萬美元的說法 -
sp_settriggerorder:指定在第一 或上次解僱的AFTER觸發器的。在第一個和最後一個觸發器之間觸發的AFTER觸發器以未定義的順序執行。
來源:MSDN
使用:
例如:
USE AdventureWorks;
GO
EXEC sys.sp_settriggerorder @triggername = N'', -- nvarchar(517)
@order = '', -- varchar(10)
@stmttype = '', -- varchar(50)
@namespace = '' -- varchar(10)
第一和最後一個觸發器必須是兩個不同的觸發器。
第一:首先觸發觸發器。
最後:觸發器最後被觸發。
無:觸發器以未定義的順序觸發。
和看@stmttype
此鏈接的價值:爲@namespace = { '數據庫' DDL Events
而且| 'SERVER'| NULL}以及更多信息,請參閱:DDL Triggers
- 1. 觸發器執行順序
- 2. 觸發執行順序
- 3. sql服務器觸發器是否具有執行順序?
- 4. SQL Server行級觸發器
- 5. SQL Server:觸發器觸發
- 6. SQL Server 2012觸發器:爲每一行執行動態sql
- 7. SQL Server - 執行順序/ AFTER TRIGGER
- 8. SQL Server觸發器
- 9. 執行順序觸發的PostgreSQL
- 10. Sql Server觸發器
- 11. Sql Server觸發器
- 12. SQL Server觸發器
- 13. SQL Server:原子觸發器
- 14. 觸發器,SQL SERVER 2008
- 15. SQL Server 2005 SQLAgent觸發器
- 16. 更新觸發器SQL Server
- 17. SQL Server 2005 - 觸發器沒有觸發
- 18. 觸發器 - 與SQL Server
- 19. 觸發器處理SQL Server
- 20. 觸發器在SQL Server
- 21. SQL Server觸發器更新
- 22. SQL Server:插入觸發器
- 23. sql server觸發器插入
- 24. SQL Server運行觸發器背景
- 25. SQL Server觸發器中的多行
- 26. SQL Server觸發器 - 複製行更新
- 27. 在批量更新中執行SQL Server觸發器
- 28. SQL Server 2014 Express - 更新觸發器沒有執行
- 29. SQL Server數據庫在觸發器執行時掛起
- 30. 在什麼情況下執行SQL Server觸發器?
通常我們不這樣做,因爲我們無法輕鬆訪問存儲過程中的插入和刪除僞指令。 – mwigdahl 2012-06-27 13:57:52