SqlServer--学习触发器

触发器是一种特殊的存储过程,一种不能被显式执行,而必须依附于一个事件的过程

            主要作用:自动化操作;减少手动操作以及出错的几率.

            触发器分类:DML(Data Manipulation Language 数据操纵语言)触发器对应数据操作事件(如Insert/Update)

                      DDL(Data Delfinition  Language 数据定义语言)触发器对应数据定义事件(如Create Table)

DML触发器

        分为:After触发器是在语句执行完毕之后触发,只能建立在常规表上;

            Instead of触发器是用替换原本的要执行的语句(操作),可以建立在常规表和视图上;

        语法:

                create trigger 触发器 on 表名
                after(for)(for与after都表示after触发器) | instead of         
                Insert|Update|Delete(其一)         as         
                begin      
                ...(执行语句)  
                end         
                
        例如下面Info表 
uIduName
1 张三
   

先看看 如何创建after触发器

   --创建insert的after触发器
   --在触发器中,有Inserted表和Deleted表包含触发器触发而受影响的数据
   --Inserted表和Deleted表与触发器所在的表结构相同(只是没有索引)
   --如果需要多次访问Inserted和Deleted表,并改其中一行:临时表 并为临时表创建索引
   create trigger tri_Info_insert_after on info after insert
   as 
   begin
   declare @Id int,
           @Name varchar(20)
      select @Id=uId,@Name=uName from inserted --这里取数据是从Inserted表中取(看下图)
      print @Id
      print @Name
   end
    
   --插入一条数据(uId是自动增长的主键)
   insert into Info(uName) values('bhqy')
            
上面创建一个简单触发器 现在用图片(一图解千愁,虽然难看了点)来好好理解触发器

trigger

再来看看delete和update的after触发器

--delete的after触发器
  create trigger tri_info_after_delete on info after delete
  as
  begin
    declare @Name varchar(100),@OldData varchar(100)
    select @OldData=uName from Info  --从Info表取要删除的数据
    select @Name=uName from deleted  --从Deleted表取删除的数据
    print @Name                       
    print @OldData
  end
   
  --执行delete语句
  delete from  Info where uId=2
  --结果为:@Name为'代管其'  @OldData为 空
  --得出图中delete结论:将Info表中数据放到了deleted表中
   
   
  --update的after触发器
  create trigger tri_info_after_update on info after update
  as
  begin
    declare @OldName varchar(20),
            @NewName varchar(20),
            @OtherData varchar(20)
            select @OtherData=uName from Info where uId=10  --先从Info表中取数据看是不是已经修改过的
            select @OldName=uName from deleted   --从deleted表取旧数据
            select @NewName=uName from inserted  --从inserted表取新数据
            print @OldName
            print @NewName
            print @OtherData
   end
    
   --执行update语句
   update Info set uName='byqh' where uId=1
   --结果为:@OldName为'宋元良' @NewName为'byqh'
   --得出图中update语句结论:将Info表中要修改(未修改的)数据放到deleted表中,在Info表修改数据,然后修改过的数据放到inserted表中
            

instead of触发器

   --创建delete的instead of触发器
   create trigger tri_info_instead_of on info instead of delete
   as
   begin
    declare @newId int
    insert into info(uName)values('hello') --插入一条名称为hello的人
    select @newId=@@IDENTITY
    print @newId    --打印 刚刚插入的hello的uId
   end
    
   delete from  Info where uId=2 --你猜猜执行完该语句的时候 uId为2的数据还在吗?
            

DML触发器总结

相同点:按语句触发,而不是按被影响的行触发的

不同点:1、after 在语句执行完毕之后触发;只触发一次;只可以建立在常规表上;可以递归触发,最高可达32级.

       2、instead of 用来替换原本的操作;不会递归触发;可以在约束被检查之前触发;可以建在表和视图上

触发器可以在表中数据发生变化时自动强制执行,触发器可以用于SQL Server约束、默认值和规则的完整性检查,还可以完成难以用普通约束实现的复杂功能.

注意:1、触发器是事务的一部分,在事务期间资源会被锁定.根据要要执行的操作和隔离的级别,锁会保持到事务结束。
     2、在触发器中尽量避免耗时及复杂的操作

 

posted @ 2013-07-23 12:02  秋壶冰月  阅读(949)  评论(0编辑  收藏