| 今天看到有朋友在群中問能否為觸發器設定執行順序,有朋友說觸發器在資料庫中自動執行,所以不能夠設定執行順序。其實這種說法是不對的,我們可以利用sp_settriggerorder為部分觸發器設定執行順序。 先看看sp_settriggerorder的功能說明: sp_settriggerorder:指定第一個激發或最後一個激發的AFTER觸發器。在第一個和最後一個觸發器之間觸發的AFTER觸發器將按未定義的順序執行。 文法說明:sp_settriggerorder [ @triggername = ] '[ triggerschema. ] triggername', [ @order = ] 'value', [ @stmttype = ] 'statement_type'[ , [ @namespace = ] { 'DATABASE' | 'SERVER' | NULL } ] 參數說明: @triggername = ] '[ triggerschema. ] triggername' 要設定或更改其順序的觸發器的名稱及其所屬的架構。 [@order=] 'value' 觸發器的新順序的設定,可以是下列值中的任意一個值。First--觸發器被第一個觸發。 Last--觸發器被最後一個觸發。 None--觸發器以未定義的順序觸發。 [@stmttype=] 'statement_type' 指定觸發器的類型,可以是INSERT、UPDATE、DELETE、LOGON 或用於激發DDL觸發器的DDL事件中列出的任何 Transact-SQL 語句事件。 @namespace = { 'DATABASE' | 'SERVER' | NULL } 如果 triggername 是 DDL 或登入觸發器,則指定所建立的 triggername 是具有資料庫範圍還是伺服器範圍。 傳回值: 0(成功)或 1(失敗) 注意: 1,當觸發器被修改,那麼對它的sp_settriggerorder設定也會失效,也就是說每次修改觸發器後,你都需要重新利用sp_settriggerorder對執行順序進行設定。 2,同一類型的觸發器(insert,update,delete)只能設定一個First與一個Last觸發器,也就是說,只能設定一個最先執行的與最後執行的觸發器,中間的就設定不了。 範例程式碼: 設定insert觸發器ti_Storage_MoveDetail為第一個執行的觸發器sp_settriggerorder 'ti_Storage_MoveDetail','first','insert' 設定update觸發器tu_Storage_MoveDetail為最後一個執行的觸發器sp_settriggerorder 'tu_Storage_MoveDetail','last','update' 所以, 如果觸發器不是instead of觸發器,而且每類(insert,update,delete)的觸發器數量不超過3個,那我們就完全可以控制執行順序。 |