zoukankan      html  css  js  c++  java
  • trigger

     

    1.插入操作(Insert) 

      Inserted表有数据,Deleted表无数据 

      2.删除操作(Delete) 

      Inserted表无数据,Deleted表有数据 

      3.更新操作(Update) 

      Inserted表有数据(新数据),Deleted表有数据(旧数据)
     

    AFTER  
    触发器在触发它们的语句完成后执行。如果该语句因错误(如违反约束或语法错误)而失败,触发器将不会执行。不能为视图指定 AFTER 触发器,只能为表指定该触发器。可以为每个触发操作(INSERT、UPDATE 或 DELETE)指定多个 AFTER 触发器。如果表有多个 AFTER 触发器,可使用 sp_settriggerorder 定义哪个 AFTER 触发器最先激发,哪个最后激发。除第一个和最后一个触发器外,所有其它的 AFTER 触发器的激发顺序不确定,并且无法控制。

    在 SQL Server 2000 中 AFTER 是默认触发器。不能在 SQL Server 7.0 版或更早的版本中指定 AFTER 或 INSTEAD OF,这些版本中的所有触发器都作为 AFTER 触发器运行。

    INSTEAD OF  
    该触发器代替触发操作执行。可在表和视图上指定 INSTEAD OF 触发器。只能为每个触发操作(INSERT、UPDATE 和 DELETE)定义一个 INSTEAD OF 触发器。INSTEAD OF 触发器可用于对 INSERT 和 UPDATE 语句中提供的数据值执行增强的完整性检查。INSTEAD OF 触发器还允许指定某些操作,使一般不支持更新的视图可以被更新。

    after 触发器对数据发生(insert,update,delete)时,才触发。  
    instead of 触发器是代替触发,要自己在触发器里对数据进行更新。

    看下面例子就知道了  

    SQL code
    
    
    create table a(id int ,a varchar(10)) create table b(id int ,b varchar(10)) create trigger test on a instead of insert as begin insert into b select * from inserted end insert into a values(1,'aaa') insert into a values(2,'aaabbb')
    
    
    select * from a (0 row(s) affected) select * from b id b -------------------- 1 aaa 2 aaabbb (2 row(s) affected) --drop table a,b
    
    

    SQL触发器实例1

    定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。触发器是一个特殊的存储过程。 

          常见的触发器有三种:分别应用于Insert , Update , Delete 事件。 

          我为什么要使用触发器?比如,这么两个表: 

          Create Table Student(              --学生表 

            StudentID int primary key,       --学号 

            .... 

           ) 

          Create Table BorrowRecord(               --学生借书记录表 

            BorrowRecord   int identity(1,1),       --流水号   

            StudentID      int ,                    --学号 

            BorrowDate     datetime,                --借出时间 

            ReturnDAte     Datetime,                --归还时间 

            ... 

          ) 

         用到的功能有: 

            1.如果我更改了学生的学号,我希望他的借书记录仍然与这个学生相关(也就是同时更改借书记录表的学号); 

            2.如果该学生已经毕业,我希望删除他的学号的同时,也删除它的借书记录。 

         等等。 

         这时候可以用到触发器。对于1,创建一个Update触发器: 

         Create Trigger truStudent 

           On Student                         --在Student表中创建触发器 

           for Update                          --为什么事件触发 

         As                                        --事件触发后所要做的事情 

           if Update(StudentID)            

           begin 

             Update BorrowRecord 

               Set StudentID=i.StudentID 

               From BorrowRecord br , Deleted   d ,Inserted i      --Deleted和Inserted临时表 

               Where br.StudentID=d.StudentID 

           end        

                     

         理解触发器里面的两个临时的表:Deleted , Inserted 。注意Deleted 与Inserted分别表示触发事件的表“旧的一条记录”和“新的一条记录”。 

         一个数据库系统中有两个虚拟表用于存储在表中记录改动的信息,分别是: 

                                 虚拟表Inserted                     虚拟表Deleted 

    在表记录新增时     存放新增的记录                         不存储记录 

             修改时           存放用来更新的新记录                   存放更新前的记录 

             删除时           不存储记录                             存放被删除的记录 

         一个Update 的过程可以看作为:生成新的记录到Inserted表,复制旧的记录到Deleted表,然后删除Student记录并写入新纪录。 

         对于2,创建一个Delete触发器 

         Create trigger trdStudent 

           On Student 

           for Delete 

         As 

           Delete BorrowRecord 

             From BorrowRecord br , Delted d 

             Where br.StudentID=d.StudentID 

         从这两个例子我们可以看到了触发器的关键:A.2个临时的表;B.触发机制。 

    if update是用来判断update要更新的是不是某个字段,如果是某个字段,则执行if后边的语句块。因为update操作是针对某个或某些字段的,所以可以用if update()来分别判断。至于insert().或者delete()是没有这样用的,因为insert和delete所对数据的改动都是整行的,并不是某个字段,就不可能像if update()这样来用了。
  • 相关阅读:
    晕倒的AIX
    MySQL Replication(zt)
    pxe启动网络安装CentOS(win平台)(zt)
    几句比较实用的script
    改注册表方式防DDOS攻击[ZT]
    一个免费空间列表相对集中的地方
    CREE LED的一个小资料
    下一步准备研究的东西:rsync远程同步
    PXE启动安装Linux (zt)
    系统调用
  • 原文地址:https://www.cnblogs.com/zyy1688/p/10002376.html
Copyright © 2011-2022 走看看