触发器(Trigger)(六)

转载 2007年09月20日 09:02:00

触发器的嵌套

当一个触发器执行时,能够触活另一个触发器,这种情况就是触发器的嵌套。在SQL Server 2005里,触发器能够嵌套到32层。

如果不想对触发器进行嵌套的话,可以通过【允许触发器激活其他触发器】的服务器配置选项来控制。但不管此设置是什么,都可以嵌套Instead Of触发器。设置触发器嵌套的选项更改方法为:

1)打开Management Studio,在【对象资源管理】中,右击服务器名,并选择【属性】选项。

2)单击【高级】节点。

3)在【杂项】里设置【允许触发器激活其他触发器】为TrueFalse。如图10所示:

10 开启/关闭触发器嵌套

现在,在Northwind数据库里建一个操作记录表,用来记录所有数据表的操作,无论是对哪个数据表进行了插入、更新或删除,都可以把操作内容和操作时间记录到操作记录表里。下面是建立操作记录表的SQL语句:

CREATE TABLE 操作记录表(

         编号 int IDENTITY(1,1) NOT NULL,

         操作表名 varchar(50) NOT NULL,

         操作语句 varchar(2000) NOT NULL,

         操作内容 varchar(2000) NOT NULL,

         操作时间 datetime NOT NULL

         CONSTRAINT DF_操作记录表_操作时间 DEFAULT (getdate()),

 CONSTRAINT PK_操作记录表 PRIMARY KEY CLUSTERED

(

         编号 ASC

)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]

) ON [PRIMARY]

GO

为了简便起见,在操作记录表里,只建一个After Insert触发器,触发器的作用是输入一条语句:数据库又有记录变动了。在实际应用时,读者可自行修改成所需的代码。

CREATE TRIGGER 操作记录表_Insert

   ON  操作记录表

   AFTER INSERT

AS

BEGIN

         print '数据库又有记录变动了'

END

GO

作为示例,只在类别表里建立一个After Insert触发器,当在类别表里插入一条记录的时候,该触发器向操作记录表里插入一条记录,而在操作记录表里插入记录时,将会触发操作记录表里的【操作记录表_Insert】触发器。

CREATE TRIGGER 类别_Insert

   ON  类别

   AFTER INSERT

AS

BEGIN

         Declare

         @类别名称 nvarchar(15),

     @说明 nvarchar(max)

         set @类别名称= (Select 类别名称 from inserted)

         set @说明= (Select 说明 from inserted)

         INSERT INTO 操作记录表(操作表名,操作语句,操作内容)

     VALUES ('类别表','插入记录','类别名称:'+@类别名称+',说明:'+@说明)

END

GO

现在运行一下对类别表的插入语句

INSERT INTO 类别(类别名称,说明)

VALUES ('书籍','各类图书')

运行结果如图11所示:

11 触发器嵌套被激活

在【消息】对话框可以看到数据库又有记录变动了,这说明,触发器已经被嵌套激活了。如果把【允许触发器激活其他触发器】的选项设为False,再看看运行结果:

12 触发器嵌套没有被激活

如图2所示,现在没有数据库又有记录变动了的提示输出,说明嵌套的触发器没有被激活。

 触发器的嵌套

当一个触发器执行时,能够触活另一个触发器,这种情况就是触发器的嵌套。在SQL Server 2005里,触发器能够嵌套到32层。

如果不想对触发器进行嵌套的话,可以通过【允许触发器激活其他触发器】的服务器配置选项来控制。但不管此设置是什么,都可以嵌套Instead Of触发器。设置触发器嵌套的选项更改方法为:

1)打开Management Studio,在【对象资源管理】中,右击服务器名,并选择【属性】选项。

2)单击【高级】节点。

3)在【杂项】里设置【允许触发器激活其他触发器】为TrueFalse。如图10所示:

10 开启/关闭触发器嵌套

现在,在Northwind数据库里建一个操作记录表,用来记录所有数据表的操作,无论是对哪个数据表进行了插入、更新或删除,都可以把操作内容和操作时间记录到操作记录表里。下面是建立操作记录表的SQL语句:

CREATE TABLE 操作记录表(

         编号 int IDENTITY(1,1) NOT NULL,

         操作表名 varchar(50) NOT NULL,

         操作语句 varchar(2000) NOT NULL,

         操作内容 varchar(2000) NOT NULL,

         操作时间 datetime NOT NULL

         CONSTRAINT DF_操作记录表_操作时间 DEFAULT (getdate()),

 CONSTRAINT PK_操作记录表 PRIMARY KEY CLUSTERED

(

         编号 ASC

)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]

) ON [PRIMARY]

GO

为了简便起见,在操作记录表里,只建一个After Insert触发器,触发器的作用是输入一条语句:数据库又有记录变动了。在实际应用时,读者可自行修改成所需的代码。

CREATE TRIGGER 操作记录表_Insert

   ON  操作记录表

   AFTER INSERT

AS

BEGIN

         print '数据库又有记录变动了'

END

GO

作为示例,只在类别表里建立一个After Insert触发器,当在类别表里插入一条记录的时候,该触发器向操作记录表里插入一条记录,而在操作记录表里插入记录时,将会触发操作记录表里的【操作记录表_Insert】触发器。

CREATE TRIGGER 类别_Insert

   ON  类别

   AFTER INSERT

AS

BEGIN

         Declare

         @类别名称 nvarchar(15),

     @说明 nvarchar(max)

         set @类别名称= (Select 类别名称 from inserted)

         set @说明= (Select 说明 from inserted)

         INSERT INTO 操作记录表(操作表名,操作语句,操作内容)

     VALUES ('类别表','插入记录','类别名称:'+@类别名称+',说明:'+@说明)

END

GO

现在运行一下对类别表的插入语句

INSERT INTO 类别(类别名称,说明)

VALUES ('书籍','各类图书')

运行结果如图11.11所示:

11 触发器嵌套被激活

在【消息】对话框可以看到数据库又有记录变动了,这说明,触发器已经被嵌套激活了。如果把【允许触发器激活其他触发器】的选项设为False,再看看运行结果:

12 触发器嵌套没有被激活

如图12所示,现在没有数据库又有记录变动了的提示输出,说明嵌套的触发器没有被激活。

 

触发器,trigger

  • 2012年11月11日 15:08
  • 479KB
  • 下载

触发器的PPT文档Trigger PPT document

  • 2009年06月23日 23:41
  • 2.12MB
  • 下载

oracle trigger(触发器)字段触发

说到oracle的触发器,一直以来都以为只能以表触发,今天有需求某个字段的值改变后触发一系列动作,原来想这个表改变再触发,后来想了一下,触发器本来很耗性能,如果这个表的每个字段更改都触发,这样做就造成...
  • diyyong
  • diyyong
  • 2014年01月21日 15:28
  • 9596

MySQL触发器Trigger实例篇

MySQL触发器Trigger实例篇 发表于668 天前 ⁄ IT技术 ⁄ 暂无评论 以前关注的数据存储过程不太懂其中奥妙,最近遇到跨数据库,同时对多个表进行CURD(Create...
  • hireboy
  • hireboy
  • 2014年01月10日 11:45
  • 27406

SQL Server 使用触发器(trigger)发送电子邮件步骤详解

本文分步骤给大家详细介绍了SQL Server 使用触发器(trigger)发送电子邮件的方法,需要的朋友可以参考下 sql 使用系统存储过程 sp_send_dbmail 发送电子邮件语法...
  • CCSUXWZ
  • CCSUXWZ
  • 2017年05月16日 17:26
  • 391

Oracle12c中多宿主环境(CDB&PDB)的数据库触发器(Database Trigger)

oracle12c引入了多宿主选项(multitenant),即出现了CDB和PDB的概念和应用,这也会对其他方方面面的特性和应用带来不小的影响和改变,本文通过实例演示,说明了在引入多宿主选项后,触发...
  • LHDZ_BJ
  • LHDZ_BJ
  • 2016年03月01日 16:56
  • 734

unity3d 理解刚体(Rigidbody)和碰撞体(Collider)以及触发器(Is Trigger),边学边更新

unity3d 理解刚体(Rigidbody)和碰撞体(Collider)以及触发器(Is Trigger),边学边更新 分类: Unity3D2014-04-01 16:50 2776...

Unity 理解刚体(Rigidbody)和碰撞体(Collider)和触发器(Is Trigger)以及刚体休眠(Rigidbody Sleeping)

前言:      今天看到看到了 Rigidbody Sleeping这个知识点,解决了我疑惑很久的一个物理学的问题。本来笔者遇到问题会想办法去解决的,但是那是想了蛮久也没想通为什么两个物体碰撞...
  • U3D_YSJ
  • U3D_YSJ
  • 2015年08月27日 00:05
  • 1705

(trigger)触发器的定义和作用

(trigger)触发器的定义和作用 博客分类: Oracle SQLCC++C#F#  第一:触发器(trigger) 触发器(trigger)是指隐含执行的存储过程pr...

mysql之触发器trigger 详解

mysql之触发器trigger 触发器(trigger):监视某种情况,并触发某种操作。 触发器创建语法四要素:1.监视地点(table) 2.监视事件(insert/update/dele...
  • wdk1011
  • wdk1011
  • 2017年07月29日 15:49
  • 112
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:触发器(Trigger)(六)
举报原因:
原因补充:

(最多只允许输入30个字)