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()这样来用了。

 

posted @ 2018-11-22 17:21  zhangniuniu  阅读(327)  评论(0编辑  收藏  举报