指定第一个或最后一个激发的、与表关联的 AFTER 触发器。在第一个和最后一个触发器之间激发的 AFTER 触发器将按未定义的顺序执行。
sp_settriggerorder[@triggername = ] 'triggername'
, [@order = ] 'value'
, [@stmttype = ] 'statement_type'
[@triggername =] 'triggername'
是将要设置或更改顺序的触发器的名称。triggername 的数据类型为 sysname。如果此名称与触发器不对应或此名称对应于 INSTEAD OF 触发器,该过程将返回错误。
[@order =] 'value'
是新触发器顺序的设置。value 的数据类型为 varchar(10),可以是下列值中的任何一个。
重要 First 和 Last 触发器必须是两个不同的触发器。
值 | 描述 |
---|---|
First | 最先激发的触发器。 |
Last | 最后激发的触发器。 |
None | 以未定义的顺序激发的触发器。 |
[@stmttype = ] 'statement_type'
指定哪条 SQL 语句激发触发器。statement_type 的数据类型为 varchar(10),可以是 INSERT、UPDATE 或 DELETE。只有在触发器已经定义为某种语句类型的触发器后,才能将其指派为该语句类型的 First 或 Last 触发器。例如,如果 TR1 定义为 INSERT 触发器,则可以将表 T1 上的 INSERT 触发器 TR1 指派为 First 触发器。如果将只定义为 INSERT 触发器的 TR1 设置为 UPDATE 语句的 First(或 Last)触发器,则 SQL Server 将返回错误信息。有关更多信息,请参见注释部分。
0(成功)或 1(失败)
单个表上的每个 INSERT、UPDATE 或 DELETE 语句只能有一个 First 和一个 Last 触发器。
如果在表上已定义了 First 触发器,则不能指派新触发器作为同一操作(INSERT、UPDATE 或 DELETE)的同一表的 First 触发器。此限制也适用于 Last 触发器。
作为 SQL Server 复制的一部分,可在已发布表上指派 First 触发器;然而,如果与用户定义的触发器存在冲突,则必须在表发布之前将用户定义触发器的指派更改为 None。
如果 ALTER TRIGGER 语句更改第一个或最后一个触发器,则除去最初在触发器上设置的 First 或 Last 特性,并且替换为 None。顺序值必须用 sp_settriggerorder 重新设置。
如果必须将同一触发器指派为多个语句类型的第一个或最后一个顺序,则必须为每个语句类型执行 sp_settriggerorder。而且,在可以将触发器指派为某个语句类型激发的 First 或 Last 触发器之前,必须先将其定义为该语句类型。
触发器所有者以及在其上定义触发器的表所有者拥有 sp_settriggerorder 的执行许可权限。当前数据库中的 db_owner 和 db_ddladmin 角色成员以及 sysadmin 服务器角色成员可以执行该存储过程。
sp_settriggerorder @triggername= 'MyTrigger', @order='first', @stmttype = 'UPDATE'