可以指定与表关联的某个 AFTER 触发器成为针对每个 INSERT、DELETE 和 UPDATE 触发操作的第一个或最后一个被触发的 AFTER 触发器。 在第一个触发器和最后一个触发器之间触发的 AFTER 触发器按未定义的顺序执行。
若要指定 AFTER 触发器的顺序,请使用 sp_settriggerorder 存储过程。 sp_settriggerorder 具有以下选项。
选项 | DESCRIPTION |
---|---|
第一 | 指定 DML 触发器是针对触发操作的第一个 AFTER 触发器。 |
最后 | 指定 DML 触发器是对应触发操作的最后一个 AFTER 触发器。 |
没有 | 指定没有应触发 DML 触发器的特定顺序。 主要用于将触发器从第一个或最后一个状态重置。 |
以下示例演示如何使用 sp_settriggerorder:
sp_settriggerorder @triggername = 'MyTrigger', @order = 'first', @stmttype = 'UPDATE'
重要
第一个和最后一个触发器必须是两个不同的 DML 触发器。
表可以同时在其上定义 INSERT、UPDATE 和 DELETE 触发器。 每个语句类型可以有自己的第一个和最后一个触发器,但它们不能是相同的触发器。
如果为表定义的第一个或最后一个触发器不包括触发动作,例如不涵盖 FOR UPDATE、FOR DELETE 或 FOR INSERT,那么对于缺少的动作就没有第一个或最后一个触发器。
不能将 INSTEAD OF 触发器指定为第一个或最后一个触发器。 INSTEAD OF 触发器在对基础表进行更新之前触发。 如果更新是由 INSTEAD OF 触发器对基础表进行的,则这些更新会在表上的所有 AFTER 触发器运行之前进行。 例如,如果视图上的 INSTEAD OF INSERT 触发器将数据插入基表,而基表本身包含一个 INSTEAD OF INSERT 触发器和三个 AFTER INSERT 触发器,那么会触发基表上的 INSTEAD OF INSERT 触发器,而不是执行插入动作,基表上的 AFTER 触发器则在基表上执行插入动作后触发。 有关详细信息,请参阅 DML 触发器。
如果 ALTER TRIGGER 语句更改第一个或最后一个触发器,则会删除 First 或 Last 属性,并将顺序值设置为 None。 必须使用 sp_settriggerorder重置订单。
OBJECTPROPERTY 函数通过使用属性 ExecIsFirstTrigger 和 ExecIsLastTrigger 来报告触发器是第一个还是最后一个触发器。
复制会自动为立即更新或排队更新订阅中包含的任何表生成第一个触发器。 复制要求其触发器是第一个触发器。 当您尝试在立即更新或排队更新订阅中包含首个触发器的表时,复制操作会引发错误。 如果尝试在订阅中包含表后将某个触发器设为第一个触发器,sp_settriggerorder 将返回错误。 如果在复制触发器上使用 ALTER 或使用 sp_settriggerorder 将复制触发器更改为最后一个或无触发器,订阅将无法正常工作。
另请参阅
OBJECTPROPERTY (Transact-SQL)
sp_settriggerorder(Transact-SQL)