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


     常见的触发器有三种:分别应用于Insert , Update , Delete 事件。(SQL Server 2000定义了新的触发器,这里不提)


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


     Create Table Student(             --学生表


       StudentID int primary key,      --学号


       ....


      )


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


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


       StudentID     int ,                   --学号


       BorrowDate    datetime,               --借出时间


       ReturnDAte    Datetime,               --归还时间


       ...


     )


 


分别创建增加、删除、更新的触发器(Trigger)来达到两张表之间数据同步的目的。


1:数据同步增加:


如有两张表——A表和B表,创建触发器使当A表插入数据后B表也同步插入数据。其中B表插入数据的字段需要同A表中的字段相对应。


CREATE TRIGGER 触发器名称 


ON A表


AFTER INSERT 


AS BEGIN INSERT INTO 


B表(B表字段1,B表字段2,B表字段3)


SELECT A表字段1,A表字段2,A表字段3 


FROM INSERTED


END


 


2.数据同步删除:


如有两张表——A表和B表,创建触发器使当A表删除数据后B表也同步删除数据。其中B表与A表应有相应主键关联。


CREATE TRIGGER 触发器名称 


ON A表 


AFTER DELETE 


AS BEGIN DELETE B表 


WHERE 


B表主键 IN( 


SELECT A表主键


FROM DELETED) 


END


 


3.数据同步更新:


如有两张表——A表和B表,创建触发器使当A表数据更新后B表也同步更新数据。


CREATE TRIGGER 触发器名称


ON A表 


AFTER UPDATE 


AS 


update B表


SET 


B.B表字段1=A.A表字段1  


FROM


B表 AS B,INSERTED AS A   


WHERE B.B表主键=A.A表主键




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


     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.触发机制。


    这里我们只讲解最简单的触发器。复杂的容后说明。