zoukankan      html  css  js  c++  java
  • 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、在触发器中尽量避免耗时及复杂的操作

  • 相关阅读:
    学好VC++的十大良好习惯
    VC6.0调试技巧
    匈牙利命名法
    VC中常用文件操作(三)
    VL_FEAT——图像处理函数库
    MATLAB——linspace
    (Your)((Term)((Project)))(字符串处理)
    Matrix Chain Multiplication(栈的简单应用)
    The Triangle(DP基础)
    MATLAB——polyfit
  • 原文地址:https://www.cnblogs.com/qq0827/p/3208227.html
Copyright © 2011-2022 走看看