如何让多个触发器按照自己想要的顺序启动?
【IT专家网独家】
问题:
我在一个表上设定了两个触发器,这两个触发器是要在该表的同一个动作里启动的,比如插入、删除、更新等执行事务。设计的第二个触发器需要在第一个触发器启动之后才启动。我怎么样才可以确保这两个触发器按照正确的顺序启动,以满足我的商务逻辑需要?另外,随着我们的系统不断改变,在处理触发器启动顺序的时候有什么需要警惕和注意的问题吗?
专家回答:
在SQL Server里,同一个表里同一个动作启动的多个触发器并没有默认的确定顺序。但是,两个AFTER触发器(即在数据库动作完成之后启动的触发器)的启动顺序可以通过使用系统存储过程sp settriggerorder来定义。这个存储过程不能用于INSTEAD OF触发器,如果你尝试对这类型的触发器的启动顺序通过这个存储过程进行定义,会出现数据库错误信息。
系统存储过程sp settriggerorder首次在SQL Server2000版本里引进,在SQL Server2005里经过改进后可以接受一个新的参数,能够支持新的DDL触发器。参数定义如下:
|
sp_settriggerorder Parameters |
|
exec sp_settriggerorder @triggername = , /* SQL Server 2000 and 2005 */ |
以下是各参数的解释:
- Parameter @triggername 不言而喻,就是指被排序的触发器。
- Parameter @order指触发器应该首先(FIRST)启动或最后启动(LAST)。如果指定NONE值,即没有对该触发器强制设定启动顺序。
- Parameter @stmttype表明触发器类型,比如INSERT触发器。
- Parameter @namespace是SQL Server2005版本独有的,表明是否在数据库或者服务器上创建了DDL触发器。如果该参数设置为NULL值,即表示触发器是一个DML触发器。
例子1——触发器启动顺序
让我们来创建一个名为customer并定义了两个INSERT触发器的表。业务要求是每插入一个新的客户,触发器1必须先于触发器2启动。
|
创建样例表 |
|
set nocount on |
|
创建触发器1 |
|
create trigger dbo.tr_customer_1 on dbo.customer |
|
创建触发器2 |
|
create trigger dbo.tr_customer_2 on dbo.customer |
|
插入语句 |
|
insert into dbo.customer default values |
|
全部的代码和结果 |

我们可以看到,这两个触发器按照我们希望的顺序启动了。
- 本文关键词:

