本文摘自《锋利的SQL》:http://item.jd.com/10380652.html
可以为一个表定义多个触发器,在某些时候,在执行这些触发器时可能需要一定的顺序。因此,允许为INSERT、DELETE或UPDATE操作指定激发的第一个和最后一个AFTER触发器,分别称之为First和Last触发器。每个语句类型只能有一个First触发器和一个Last触发器,并且First和Last触发器必须是两个不同的触发器。在First和Last触发器之间的AFTER触发器没有固定的执行顺序。
要指定AFTER触发器的顺序,应当使用sp_settriggerorder存储过程。例如,下面的语句设置MyTrigger触发器是应用于UPDATE语句的第一个触发器:
sp_settriggerorder @triggername = 'MyTrigger',@order = 'first', @stmttype = 'UPDATE'
由于INSTEAD OF触发器一直在对基础表进行更新前激发,因此,不能将INSTEAD OF触发器指定为第一个或最后一个触发器。
如果使用ALTERTRIGGER语句更改了First或Last触发器,则会删除它们的顺序值,必须使用sp_settriggerorder来重新设置。
可以通过OBJECTPROPERTY()函数的ExecIsFirstDeleteTrigger、ExecIsFirstInsertTrigger、ExecIsFirstUpdateTrigger和ExecIsLastDeleteTrigger、ExecIsLastInsertTrigger、ExecIsLastUpdateTrigger属性来确定触发器是否为First触发器还是Last触发器。参考下面的语句:
sp_settriggerorder @triggername = 'Trigger1',@order = 'first', @stmttype = 'UPDATE'
SELECT OBJECTPROPERTY(OBJECT_ID(N'Trigger1'),'ExecIsFirstUpdateTrigger'); --返回1,表示是用于UPDATE的First触发器
OBJECTPROPERTY( )函数的第一个参数是数据库中对象的ID,可以通过OBJECT_ID函数根据指定的对象名称来获得ID。第二个参数是要获取信息的属性名称。如果是,返回1,否则返回0。如果指定的属性名称不正确,返回NULL。