【SQL原理】触发器原理案例分析-nivenm
Access软件网QQ交流学习群(群号码198465573),欢迎您的加入!
首页 >技术文章> ADP及SQL SERVER


【SQL原理】触发器原理案例分析

发表时间:2013/11/25 8:30:00 评论(0) 浏览(7740)  评论 | 加入收藏 | 复制
   
摘 要:触发器,分析
正 文:

【SQL原理】触发器原理案例分析
    一直想讲一下触发器,但自己对触发器的了解,也仅限于实际工作中要用到的时候,拿来用用,至于太多原理性的东西,基本也没有涉略。经过查阅了一下网上的资料,自以为还算能够理解,所以拿出来和大家讲讲,不恰当或者错误的地方还请大家斧正。
    定义: 何为触发器?在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.触发机制。


     Trigger语法

     Create TRIGGER trigger_name
     ON { table | view }
     [ WITH ENCRYPTION ] --用于加密触发器
     {
     { { FOR | AFTER | INSTEAD OF } { [ Insert ] [ , ] [ Update ] }
     [ WITH APPEND ]
     [ NOT FOR REPLICATION ]
     AS
     [ { IF Update ( column )
     [ { AND | or } Update ( column ) ]
     [ ...n ]
     | IF ( COLUMNS_UpdateD ( ) { bitwise_operator } updated_bitmask )
     { comparison_operator } column_bitmask [ ...n ]
     } ]
     sql_statement [ ...n ]
     }
     }

关于触发器,还应该注意
(1)、Delete 触发器不能捕获 TRUNCATE TABLE 语句。
(2)、触发器中不允许以下 Transact-SQL 语句:
     Alter DATABASE Create DATABASE DISK INIT
     DISK RESIZE Drop DATABASE LOAD DATABASE
     LOAD LOG RECONFIGURE RESTORE DATABASE
     RESTORE LOG
(3)、触发器最多可以嵌套 32 层。

 


Access软件网交流QQ群(群号:198465573)
 
 相关文章
学习报销系统的一些总结1-计时触发器的理解和认识  【yonglz  2008/9/18】
[转帖]触发器FAQ  【郑家龙  2009/2/13】
SQL触发器存储过程……  【乐乐  2011/11/23】
SQL触发器的使用及语法  【风行  2012/1/17】
常见问答
技术分类
相关资源
文章搜索
关于作者

nivenm

文章分类

文章存档

友情链接