简析sqlserver触发器以及如何使用sql 触发器

来源:互联网 发布:呼和浩特乾宇网络 编辑:程序博客网 时间:2024/06/06 01:42

公司开早会,今天分享sqlserver触发器,发上来也给大家瞅瞅。

 

触发器对表进行插入、更新、删除的时候会自动执行的特殊存储过程。触发器一般用在check约束更加复杂的约束上面。触发器和普通的存储过程的区别是:触发器是当对某一个表进行操作。诸如:update、insert、delete这些操作的时候,系统会自动调用执行该表上对应的触发器。SQL Server 2005中触发器可以分为两类:DML触发器和DDL触发器,其中DDL触发器它们会影响多种数据定义语言语句而激发,这些语句有create、alter、drop语句。DML触发器分为:

a、 insert触发器

b、 update触发器

c、 delete触发器

主要研究了一下DML触发器

 

鄙人总结如下:


1.触发器主要是通过事件进行触发被自动调用执行的
2.触发器是一个特殊的存储过程,但和存储过程的调用方式不同。(事件触发)
3.常见的触发器有三种:分别应用于Insert , Update , Delete 事件。
4.一个数据库系统中有两个虚拟表用于存储在表中记录改动的信息
分别是:虚拟表Inserted和虚拟表Deleted
Deleted 与Inserted分别表示触发事件的表“旧的一条记录”和“新的一条记录”


创建触发器:
CREATE TRIGGER triggerName  --触发器名字
ON table                    --对哪个表创建触发器
FOR update/delete/insert    --因什么事件触发
AS
BEGIN
                            --事件触发后要做的事情 例如:对与主表关联的表的相关信息进行同步更新
END

 

献上鄙人找到的最通俗理解触发器原理及作用的一个小事例:
我们为什么要使用触发器?比如,这么两个表
eg:
      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.触发机制。

 

再理解一下deleted和inserted两个临时表的差异

Inserted
存放进行insert和update 操作后的数据
Deleted
存放进行delete 和update操作前的数据
注意:update 操作相当于先进行delete 再进行insert ,所以在进行update操作时,修改前的数据拷贝一条到deleted 表中,修改后
的数据在存到触发器作用的表的同时,也同时生成一条拷贝到insered表中

欢迎转载,但请注明出处,第一篇SQL原创博文

原创粉丝点击