今天看到有朋友在群中问能否为触发器设置执行顺序,有朋友说触发器在数据库中自动执行,所以不能够设置执行顺序。其实这种说法是不对的,我们可以利用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个,那我们就完全可以控制执行顺序。r貜賬b哊T Y栠sIRg憃