SqlServer触发器理解

来源:互联网 发布:ubuntu安装教程u盘 编辑:程序博客网 时间:2024/06/04 19:36

触发器的定义与分类:

只要触发器所在表上的对应时间发生,就会自动执行该触发器的代码.实际上,我们并不能直接调用触发器,唯一的方法是在分配哦触发器的表上执行某种行为方可激活触发器.      [触发器是一种特殊的存储过程,他在执行特定的语言事件时生效

 

       SQL Server包括两大类触发器:DDL(数据定义语言)触发器和DML(数据操作语言)触发器

 

 

DDL触发器:

              当服务器或数据库中发生数据定义语言(DDL),将调用这些触发器.DDL触发器是一种特殊的触发器,在影响数据定义语言语句时出发,可以用于在数据中执行管理任务,例如审核以及规范数据库中的操作.

              例如:Drop table,Create table

例1:

     

      create trigger tr_1

      on database

      for Create_Table  --|| Drop_Table

      as

         raiserror('你不能创建表',16,1)

            rollback      --可以进行回滚因为Create_table 是隐式事务

                     

                    drop trigger tr_1 on database –-删除触发器时必须有on database指明是删除数据库上的触发器

 

 

DML触发器:
    当数据库操作中发生数据操作语言(DML)事件时,将调用DML触发器.
    
     DML触发器可以分为以下3种类型:
      1.AFTER 触发器:AFTER 触发器只能在表上指定 (后触发)
          在执行Insert Update Delete 语句操作之后执行 AFTER 触发器,制定
AFTER与制定For相同.
      2.INSTEAD OF触发器 (替代触发)
          可以对视图或表定义但一个 INSTEAD OF   Insert/Update/Delete触发器 只
能有一个
      3.CLR触发器.可以是上面2种或者DDL触发器

 

      DML触发器细分为4种类型
        Insert触发器
        Delete触发器
        Update触发器
        以上几种类型的混合配饰触发器

 

①一个表可以有多个后触发器,但只能有一个替代触发器    视图上只能有替代触发器不能有后触发器

 

AFTER 触发器(后触发)

    实例1:

 

 

        if exists(select * from sysobjects where name='tr_3')

        drop trigger tr_3

        Go

        Create trigger tr_3

        on Employee

        for update   –-当执行完了update语句后才会跳到我们后面定义的语句块

              as

                if update(CardID)    –-判断是否对某一列进行了更改

                        raiserror('你不更改卡号ID',16,1)

        实例2:

         if exists(select * from sysobjects where name='tr_4')

        drop trigger tr_4

        Go

        Create trigger tr_4

        on Employee

        for delete

        as

            raiserror('不能删除员工',16,1)

 

②所谓的后触发就是执行完了对应的操作才执行我们定义的触发器内的语句块

 

 

 

INSTEAD OF触发器 (替代触发) :     

        实例1:

        if exists(select * from sysobjects where name='tr_5')

        drop trigger tr_5

        Go

        Create trigger tr_5

        on Employee

        instead of delete 替代了删除事件

         as

           select * from deleted  --看看临时deleted表里面有什么

                delete from pay where CardID in (select CardID from deleted)  --先删子表再删基表

 

                 执行delete from Employee where CardID in (select CardID from deleted)

 

 

 

 

③[所谓的替代触发就是不执行对应的操作而执行我们定义触发器内的语句块

 

 

触发器使用的inserted临时表和deleted临时表:[无论是后触发还是替代触发都产生这2个临时表]:

 

                                  虚拟表Inserted                             虚拟表Deleted
 执行Update时  将更新数据放到Inserted临时表       将原来的数据放进Deleted的临时表
 执行Insert时    将插入的数据放到Inserted临时表                        /
 执行Delete时                   /                                  将删除的数据放到deleted临时表

 

 

l.两个表的结构与激活触发器的原数据表结构相同。
2. 用INSERT语句插入记录激活触发器时,系统在原表插入记录的同时,也自动把记录插入到inserted临时表。
3. 用Delete语句删除记录激活触发器时,系统在原表删除记录的同时,会把删除的记录添加到deleted临时表。
4. 用UPDATE语句修改数据激活触发器时,系统先在原表删除原有记录,删除的记录被添加到deleted临时表,然后再插入新记录,并同时插入到inserted临时表。
5. 用户可以用SELECT语句查询这两个临时表,但不允许进行修改。
6. 触发器一旦执行完成,这两个表将被自动删除。

SqlServer的触发原理是:

             比如我在表上制定了一个后触发器当插入了数据后往另外一个表也插入这条数据

             当我执行insert的一条数据后 执行触发器的语句  往另外一个表插入数据

             问题来了 当我连续插入10条数据 触发器的运行机制又是怎样的呢?

            

             SqlServer与MySql不同的点在于SqlServer在执行完10条插入Sql语句才允许触发器内的语句.

             而MySql是行级触发  也就是插入一条数据就执行触发器内的语句

 

 

原创粉丝点击