触发器(Trigger)(七)

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

 设计Instead Of触发器

Instead Of触发器与After触发器的工作流程是不一样的。After触发器是在SQL Server服务器接到执行SQL语句请求之后,先建立临时的Inserted表和Deleted表,然后实际更改数据,最后才激活触发器的。而Instead Of触发器看起来就简单多了,在SQL Server服务器接到执行SQL语句请求后,先建立临时的Inserted表和Deleted表,然后就触发了Instead Of触发器,至于那个SQL语句是插入数据、更新数据还是删除数据,就一概不管了,把执行权全权交给了Instead Of触发器,由它去完成之后的操作。

  Instead Of触发器的使用范围

Instead Of触发器可以同时在数据表和视图中使用,通常在以下几种情况下,建议使用Instead Of触发器:

数据库里的数据禁止修改:例如电信部门的通话记录是不能修改的,一旦修改,则通话费用的计数将不正确。在这个时候,就可以用Instead Of触发器来跳过Update修改记录的SQL语句。

有可能要回滚修改的SQL语句:如11.5.3节中的例二,用After触发器并不是一个最好的方法,如果用Instead Of触发器,在判断折扣大于0.6时,就中止了更新操作,避免在修改数据之后再回滚操作,减少服务器负担。

在视图中使用触发器:因为After触发器不能在视图中使用,如果想在视图中使用触发器,就只能用Instead Of触发器。

用自己的方式去修改数据:如不满意SQL直接的修改数据的方式,可用Instead Of触发器来控制数据的修改方式和流程。

 设计简单的Instead Of触发器

Instead Of触发器的语法如下:

CREATE TRIGGER 触发器名

   ON  数据表名或视图名

   Instead Of INSERTDELETEUPDATE

AS

BEGIN

         --这里是要运行的SQL语句

END

GO

从上面可以看得出,Instead Of触发器与After触发器的语法几乎一致,只是简单地把After改为Instead Of。前面说过的11.5.3节中的例二,用After触发器并不是一个最好的方法,如果用Instead Of触发器,在判断折扣大于0.6时,就中止了更新操作,避免在修改数据之后再回滚操作,减少服务器负担。现将原来的触发器改为Instead Of触发器:

CREATE TRIGGER 订单明细_Insert

   ON  订单明细

   Instead Of INSERT

AS

BEGIN

         SET NOCOUNT ON;

         declare

         @订单ID int,

         @产品ID int,

         @单价 money,

         @数量 smallint,

         @折扣 real

         set @订单ID = (select 订单ID from inserted)

         set @产品ID = (select 产品ID from inserted)

         set @单价 = (select 单价 from inserted)

         set @数量 = (select 数量 from inserted)

         set @折扣 = (select 折扣 from inserted)

         if (@折扣)>0.6

                            print '折扣不能大于0.6'

         else

                            INSERT INTO 订单明细

                                     (订单ID,产品ID,单价,数量,折扣)

                            VALUES

                                     (@订单ID,@产品ID,@单价,@数量,@折扣)

         END

GO

上面的触发器里写入了一句“SET NOCOUNT ON”,这一句的作用是,屏蔽在触发器里Insert语句执行完之后返回的所影响行数的消息。

  查看DML触发器

查看已经设计好的DML触发器有两种方式,一种是通用Management Studio来查看,一种是利用系统存储过程来查看。

  Management Studio中查看触发器

Management Studio中查看触发器的步骤:

1)启动Management Studio,登录到指定的服务器上。

2)在如图13所示界面的【对象资源管理器】下选择【数据库】,定位到要查看触发器的数据表上,并找到【触发器】项。

13 查看触发器列表

3)单击【触发器】,在右边的【摘要】对话框里,可以看到已经建好的该数据表的触发器列表。如果在点击【触发器】后,右边没有显示【摘要】对话框,可以在单击菜单栏上的【视图】菜单,选择【摘要】选项,打开【摘要】对话框。如果在【摘要】对话框里没有看到本应存在的触发器列表,可以【摘要】对话框里右击空白处,在弹出的快捷菜单中选择【刷新】选项,刷新对话框后即可看到触发器列表。

4)双击要查看的触发器名,Management Studio自动弹出一个【查询编辑器】对话框,对话框里显示的是该触发器的内容,如图14所示:

14 查看触发器内容

用系统存储过程查看触发器

SQL Server 2005里已经建好了两个系统存储过程,可以用这两个系统存储过程来查看触发器的情况:

  sp_help

系统存储过程“sp_help”可以了解如触发器名称、类型、创建时间等基本信息,其语法格式为:

sp_help  ‘触发器名

举例:

sp_help  '产品_Insert'

运行结果如图11.15所示,可以看到触发器产品_insert”的基本情况。

11.15 查看触发器的基本情况

 sp_helptext

系统存储过程“sp_helptext”可以查看触发器的文本信息,其语法格式为:

sp_helptext  ‘触发器名

举例:

sp_helptext  '产品_Insert'

运行结果如图11.16所示,可以看到触发器产品_insert”的具体文本内容。

16 查看触发器的基本情况

 

相关文章推荐

触发器,trigger

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

触发器的PPT文档Trigger PPT document

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

MySQL触发器Trigger实例篇

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

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

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

oracle trigger(触发器)字段触发

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

(05) 触发器(Trigger)的维护困境

触发器(trigger)在维护中的斑斑劣迹,我碰到的那是数不胜数.         首先不是说trigger不好,数据库都提供这个技术,自然有它的好处.  其中之一, 处理某些业务时特别简便.    ...

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

做实验的时候发现了一个很诡异的事情,就是发生碰撞的主体一定是要带刚体的,即只有带刚体的碰撞体去撞其他碰撞体时,双方才会收到碰撞事件,以下是我做的实验: 一、控制A(刚体加碰撞体)撞击 静止的B(碰撞...
  • ybhjx
  • ybhjx
  • 2015年12月23日 20:12
  • 777

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

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

触发器Trigger介绍

触发器简介         触发器是数据库的一种,编码方式类似于存储过程,当有DML语句对表进行操作的时候,可以引起触发器的执行,从而实现对表的数据一致性维护;         通过触发器...

cocos2d-x CocoStudio中场景触发器(Trigger)的使用和扩展

场景编辑器中的触发器是一种通过事件触发机制,在特定的事件被触发的时候自动执行自己预先定义的动作或者功能。 编辑器中带有一些默认的事件、条件和动作,当然也可以扩展自定义的事件、条件和动作。 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:触发器(Trigger)(七)
举报原因:
原因补充:

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