CTOCIO IT专家网

天极传媒 比特网 | 天极网 | IT专家网 | IT商网 | 52PK游戏网 | 手机天极 | IT分众 |
IT专家网搜索

数据库 | Oracle | DB2 | SQL Server | MySQL | 商业智能 | BI | DBA | Sybase| SQL Server 2008

如何让多个触发器按照自己想要的顺序启动?

作者: Echo,  出处:IT专家网, 责任编辑: 李书琴, 
2008-01-17 13:22
  

  【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 */
@order = [FIRST|LAST|NONE], /* SQL Server 2000 and 2005 */
@stmttype = [INSERT|UPDATE|DELETE|], /* SQL Server 2000 and 2005 */
@namespace = [DATABASE|SERVER|NULL] /* SQL Server 2005 only */

  以下是各参数的解释:

  •   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
go
create table dbo.customer (customerid int identity primary key)
go

创建触发器1

create trigger dbo.tr_customer_1 on dbo.customer
for insert
as
set nocount on
print 'firing original trigger 1'
go

创建触发器2

create trigger dbo.tr_customer_2 on dbo.customer
for insert
as
set nocount on
print 'firing original trigger 2'
go

插入语句

insert into dbo.customer default values
go

全部的代码和结果

全部代码和结果

  我们可以看到,这两个触发器按照我们希望的顺序启动了。

共2页。 1 2 :

网友评论

笔名 
请您注意:遵守国家有关法律、法规,尊重网上道德,承担一切因您的行为而直接或间接引起的法律责任。    IT专家网友拥有管理笔名和留言的一切权利。
  • 周排行榜
  • 月排行榜

邮件订阅


    
天极服务 | 关于我们 | 网站律师 | 加入我们 | 联系我们 | 广告业务 | 友情链接 | 我要挑错
All Rights Reserved, Copyright 2004-2008, Ctocio.com.cn
渝ICP证B2-20030003号 如有意见请与我们联系 powered by 天极内容管理平台CMS4i