sp_settriggerorder (Transact-SQL)

更新日期: 2006 年 12 月 12 日

指定第一个激发或最后一个激发的 AFTER 触发器。在第一个和最后一个触发器之间触发的 AFTER 触发器将按未定义的顺序执行。

主题链接图标Transact-SQL 语法约定

语法

 sp_settriggerorder [ @triggername = ] '[ triggerschema. ] triggername'          , [ @order = ] 'value'          , [ @stmttype = ] 'statement_type'          [ , [ @namespace = ] { 'DATABASE' | 'SERVER' | NULL } ]

参数

  • [ @triggername= ] '[ triggerschema**.****] triggername**'**
    要设置或更改其顺序的触发器的名称及其所属的架构(如果适用)。[triggerschema**.**]triggername 的数据类型为 sysname。如果名称与触发器不对应,或者名称与 INSTEAD OF 触发器对应,则该过程将返回错误。不能为 DDL 或登录触发器指定 triggerschema
  • [ @order= ] 'value'
    触发器的新顺序的设置。value 的数据类型为 varchar(10),可以是下列值中的任意一个值。

    ms186762.note(zh-cn,SQL.90).gif重要提示:
    FirstLast 触发器必须是两个不同的触发器。
    说明

    First

    触发器被第一个触发。

    Last

    触发器被最后一个触发。

    None

    触发器以未定义的顺序触发。

  • [ @stmttype= ] 'statement_type'
    指定激发触发器的 SQL 语句。statement_type 的数据类型为 varchar(50),可以是 INSERT、UPDATE、DELETE、LOGON 或用于激发 DDL 触发器的 DDL 事件中列出的任何 Transact-SQL 语句事件。不能指定事件组。

    只有已将触发器定义为某个语句类型的触发器之后,才能将该触发器指定为该语句类型的 FirstLast 触发器。例如,如果 TR1 已定义为 INSERT 触发器,则可将触发器 TR1 指定为表 T1 的 INSERT 语句的 First 触发器。如果已将 TR1 仅定义为 INSERT 触发器,但却被设置为 UPDATE 语句的 FirstLast 触发器,则 SQL Server 2005 数据库引擎将返回错误。有关详细信息,请参阅“备注”部分。

  • @namespace= { 'DATABASE' | 'SERVER' | NULL }
    如果 triggername 是 DDL 或登录触发器,则指定所创建的 triggername 是具有数据库范围还是服务器范围。注意只能创建具有服务器范围的登录触发器。有关 DDL 触发器作用域的详细信息,请参阅设计 DDL 触发器。如果未指定或指定为 NULL,则 triggername 为 DML 触发器。

返回代码值

0(成功)或 1(失败)

备注

用于单个表的每个语句只能有一个 First 触发器和一个 Last 触发器。

如果已为表、数据库或服务器定义了 First 触发器,则不能为相同 statement_type 的同一个表、数据库或服务器指定新的 First 触发器。此限制也适用于 Last 触发器。

复制将为包含在立即更新订阅或排队更新订阅中的任意表自动生成第一个触发器。复制要求其触发器为第一个触发器。在尝试将带有第一个触发器的表包含在立即更新订阅或排队更新订阅中时,复制将引发错误。如果在表已经包含在订阅中之后,尝试使某个触发器成为第一个触发器,sp_settriggerorder 将返回错误。如果对复制触发器使用 ALTER TRIGGER,或使用 sp_settriggerorder 将复制触发器改为 Last 触发器或 None 触发器,则订阅将不能正确工作。

如果 ALTER TRIGGER 语句更改了第一个或最后一个触发器,则最初为触发器设置的 FirstLast 属性被删除,并且其值被替换为 None。必须使用 sp_settriggerorder 重新设置顺序值。

如果必须将同一触发器指定为多个语句类型的第一个或最后一个触发器,则必须为每个语句类型执行 sp_settriggerorder。另外,必须先将触发器定义为某个语句类型,然后才能将其指定为针对该语句类型激发的 FirstLast 触发器。

权限

若要设定具有服务器范围的 DDL 或登录触发器的顺序 (created ON ALL SERVER),则需要 CONTROL SERVER 权限。

若要设置具有数据库范围的 DDL 触发器的顺序 (created ON DATABASE),则需要 ALTER ANY DATABASE DDL TRIGGER 权限。

若要设置 DML 触发器的顺序,则需要对要定义该触发器的表或视图具有 ALTER 权限。

示例

A. 设置 DML 触发器的触发顺序

以下示例指定触发器 uSalesOrderHeader 是对 Sales.SalesOrderHeader 表执行 UPDATE 操作后触发的第一个触发器。

USE AdventureWorks;
GO
sp_settriggerorder @triggername= 'Sales.uSalesOrderHeader', @order='First', @stmttype = 'UPDATE';

B. 设置 DDL 触发器的触发顺序

以下示例指定触发器 ddlDatabaseTriggerLog 是对 AdventureWorks 数据库执行 ALTER_TABLE 操作后触发的第一个触发器。

USE AdventureWorks;
GO
sp_settriggerorder @triggername= 'ddlDatabaseTriggerLog', @order='First', @stmttype = 'ALTER_TABLE', @namespace = 'DATABASE';

请参阅

参考

系统存储过程 (Transact-SQL)
数据库引擎存储过程 (Transact-SQL)
ALTER TRIGGER (Transact-SQL)

帮助和信息

获取 SQL Server 2005 帮助

更改历史记录

发布日期 历史记录

2006 年 12 月 12 日

新增内容:
  • 在此主题中添加了有关在 SQL Server 2005 Service Pack 2 中引入的登录触发器的信息。