Access开发培训
网站公告
·Access专家课堂QQ群号:151711184    ·Access快速开发平台下载地址及教程    ·欢迎加入Access专家课堂微信群!    ·如何快速搜索本站文章|示例|资料    
您的位置: 首页 > 技术文章 > ADP及SQL SERVER

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

时 间:2013-11-25 08:30:00
作 者:nivenm   ID:29828  城市:无锡
摘 要:触发器,分析
正 文:

【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交流群 (群号:54525238)       Access源码网店

常见问答:

技术分类:

相关资源:

专栏作家

关于我们 | 服务条款 | 在线投稿 | 友情链接 | 网站统计 | 网站帮助