触发器的学习

    触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活。所以触发器可以用来实现对表实施复杂的完整性约束。

    常见的触发器有三种(FOR | AFTER | INSTEAD OF):分别应用于Insert ,Update , Delete 事件。

     

FOR | AFTER


    AFTER 指定触发器仅在触发 SQL 语句中指定的所有操作都已成功执行时才被触发。所有的引用级联操作和约束检查也必须在激发此触发器之前成功完成。
如果仅指定 FOR 关键字,则 AFTER 为默认值。

不能对视图定义 AFTER 触发器。

After触发器的工作原理(是在Insert,update和delete操作完成后才激活的):

    在记录变更之后才被激活,若要删除记录,当sqlserver接到一个要执行删除操作的SQL语句时,Sql server先将要删除的记录存放在删除表里,然后把数据表里的记录删除,再激活After触发器,执行after触发器里的SQL语句,执行完毕后,删除内存中的删除表,退出整个操作。


INSTEAD OF


    指定执行 DML 触发器而不是触发 SQL 语句,因此,其优先级高于触发语句的操作。执行触发器语句,但不执行触发触发器的SQL 语句,比如试图删除一条记录时,将执行触发器指定的语句,此时不再执行 delete 语句。

    INSTEAD OF触发器被用于更新那些没有办法通过正常方式更新的视图。例如,通常不能在一个基于连接的视图上进行DELETE操作。然而,可以编写一个INSTEAD OF DELETE触发器来实现删除。上述触发器可以访问那些如果视图是一个真正的表时已经被删除的数据行。将被删除的行存储在一个名为deleted的工作表中,就像AFTER触发器一样。相似地,在UPDATE INSTEAD OF触发器或者INSERT INSTEAD OF触发器中,你可以访问inserted表中的新行。


区别:


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

   

举个简单的例子,对比一下:


    新建两个表,两个表的关系如图:test_main为测试主表,test_sub为测试子表

        

创建For触发器:

-- 创建 FOR 触发器.
CREATE TRIGGER InsertTest
ON test_sub
FOR INSERT
AS
BEGIN
PRINT('INSERT test_sub!');
END;
Go
执行语句

INSERT INTO test_sub VALUES( 100,100,'100');

执行结果:

消息 547,级别 16,状态 0,第 1 行
INSERT 语句与 FOREIGN KEY 约束"FK_test_sub_test_main"冲突。该冲突发生于数据库"test",表"dbo.test_main", column 'id'。

语句已终止。

将For关键字改为AFTER结果也是一样。将关键字修改为INSTEAD OF

执行结果:INSERT test_sub!


从上面的结果看到,触发器被执行了。
但是 test_sub 中并没有 100,100,'100' 的数据。
原因在于:INSTEAD OF 指定执行 DML 触发器而不是触发 SQL 语句

也就是说 当你的触发器是 INSTEAD OF INSERT 的时候
你的 INSERT 语句,将直接执行这个触发器
而不是等你 INSERT 语句执行完了,数据写到表里面了以后,才触发。


Instead Of触发器的使用范围


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

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

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

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

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



  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 17
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值