触发器(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触发器和自定义方法

$(function () { var oTxt = $("input"); //trigger触发器,需要把事件放在自己的身上去触发事件;触发事件不需要用户...
  • younghaiqing
  • younghaiqing
  • 2016年10月21日 15:35
  • 698

Sybase触发器学习

这几日需要设计项目的几个报表统计模块,然后统计其数值。时间甚赶,需要新增一堆表,且以前的一个主表被修改并没有对应的log表,得重新设计。写log表要求使用触发器实现。   所以在网上查找半天syba...
  • qq_29663071
  • qq_29663071
  • 2016年07月15日 13:45
  • 266

[oracle] 触发器使用教程和命名规范

触发器使用教程和命名规范       目  录   触发器使用教程和命名规范    1  1,触发器简介 1  2,触发器示例 2  3,触发器语法和功能  3  4,例一:行级触发器之一    4 ...
  • xys_777
  • xys_777
  • 2010年07月16日 01:04
  • 4303

android:SQLite--触发器详解

关于SQLite基础部分:SQLite基础学习 SQLite 的触发器是数据库的回调函数,它会自动执行/指定的数据库事件发生时调用。SQLite 的触发器可以指定在特定的数据库表发生 delet...
  • qq_17326933
  • qq_17326933
  • 2015年09月01日 21:24
  • 3319

oracle数据库触发器(trigger)用法总结

http://yedward.net/?id=116   触发器的意思就是当我们对数据库对象(一般是表或视图)进行insert、update、delete操作的时候,这些操作会相应的触发一些事件的...
  • zhanzhib
  • zhanzhib
  • 2015年09月25日 10:12
  • 10594

数据库(SQL)之trigger(触发器)的使用以及视图(view)的基本实现

对于触发器,首先需要明确的是一下几点: trigger_name 必须给触发器命令,最多64个字符,建议用表的名字_触发器类型的缩写方法命名。如ttlsa_posts_bi(表ttlsa_posts,...
  • u013816144
  • u013816144
  • 2015年12月05日 12:18
  • 1235

Oracle Trigger 触发器

Oracle Trigger 在Oracle8i之前,只允许给予表或者视图的的DML的操作,而从Oracle8i开始,不仅可以支持DML触发器,也允许给予系统事件和DDL的操作. 一、触发器的分类...
  • bbliutao
  • bbliutao
  • 2012年08月06日 11:16
  • 1873

sqlite3触发器的使用

研究了一下osx下dock中应用的存储,位于~/Library/Application Support/Dock/下一个比较名字比较长的db文件中,之前简单的介绍过osx launchpad图标的删除...
  • dliyuedong
  • dliyuedong
  • 2014年10月29日 00:22
  • 10365

SQLite创建触发器 CREATE TRIGGER

CREATE TRIGGER sql-statement ::=CREATE[TEMP|TEMPORARY]TRIGGERtrigger-name[BEFORE|AFTER] database-ev...
  • L_serein
  • L_serein
  • 2012年11月09日 15:42
  • 4808

MySQL触发器Trigger实例篇

MySQL触发器Trigger实例篇 发表于668 天前 ⁄ IT技术 ⁄ 暂无评论 以前关注的数据存储过程不太懂其中奥妙,最近遇到跨数据库,同时对多个表进行CURD(Create...
  • hireboy
  • hireboy
  • 2014年01月10日 11:45
  • 29219
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:触发器(Trigger)(七)
举报原因:
原因补充:

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