zoukankan      html  css  js  c++  java
  • MSSQLSERVER数据库- 触发器

      参考了别人写的文章,我删除掉一些废话,只看一些我想看的信息。整理了一下,记录在这里,方便以后查阅!

      1.当触发INSERT触发器时,新的数据行就会被插入到触发器表和inserted表中。
      2.当触发delete触发器后,从触发器表中删除的行将被保存到deleted表中。注意:deleted表和触发器表中没有相同的行。执行truncate table语句时触发器不会执行。
      3.当触发update触发器时,更新前的数据移入到deleted表,更新后数据被移入到inserted表。

    一、使用例子

    例子1:创建一个触发器,如果产品有订购历史,则回滚。

    create trigger trig_DeleteProduct
    on Products
    for delete
    as
    if (select count(*) from [Order Details] as OD inner join deleted as D on OD.ProductID = D.ProductID) > 0
    begin
        raiserror('该产品已经有订购信息,不能被删除!',16,1)
        rollback transaction
        return
    end

    例子2:保证不能删除表中数据

    create trigger trig_ProtectData
    on TableName for delete
    as
    raiserror('不能删除改表中的数据',16,1,'提示')
    rollback transaction
    return

    例子3:保证每次最多只能删除一个雇员

    create trigger trig_DeleteEmployee
    on Employees 
    for delete
    as
    if (select count(*) from deleted) > 1
    begin
        raiserror('一次不能删除多条数据!',16,1)
        rollback transaction
        return
    end

    例子4:监视指定列的数据更新

    create trigger trig_UpdateEmployee
    on Employees 
    for update
    as
    if update(FirstName)
    begin
        raiserror('FirstName不能更新!',16,1)
        rollback transaction
        return
    end

    例子5:更新时引起关联表某字段值的更新

    ALTER TRIGGER [tr_UpdateStudent]
       ON  [dbo].[T_Student] FOR UPDATE
    AS
        DECLARE @updateI int 
    BEGIN
        SELECT @updateI = TId FROM INSERTED;
        
        UPDATE dbo.T_Teacher SET XM='0' WHERE Id=@updateI;
        
    END

    以后发现有新的例子 继续添加在。。

    二、触发器多一点了解

    1、触发器的被动型

      被动型的意思是指触发器发生在事务之后。当激活触发器时,整个查询已经运行并且事务也已经被记录到日志中(但未提交,只是记录到激活触发器的语句点)。这意味着如果触发器需要回滚,那么必须撤销已经做的所有工作。这和约束是不同,约束是主动的,约束是发生在语句真正执行前。这意味着约束会检测可能失败的操作,并且在进程的前期就予以阻止。所以约束通常运行得快一些-在更为复杂的查询中速度更快。注意,只有在发生回滚时,约束明显更快。

       如果正在处理少量回滚,而且受影响的语句的复杂性较低,执行之间较短,那么触发器和约束之间没有太大的区别。但是在无法预知回滚的数量的时候,坚持使用约束的效率更好

    2、使用IF UPDATE()和COLUMNS_UPDATE()

      UPDATE()函数只在触发器的作用域内适用。它唯一的目的是提供一个布尔值,来说明特殊列是否已经更新。

      COLUMNS_UPDATE()函数和UPDATE()的运行方式不同,但目的相同。COLUMNS_UPDATE()函数可以一次检查多列。为了实现这一点,该函数使用了位掩码。

      于上图的情况,数据的单个字节说明了第2,第3,以及第6列已经更新,而其他列没有更新。对于超过8列的情况,SQL Server就会在右边添加另一个字节并且继续计数。

    对于上图,这次是跟心了第2,第9以及第14列。

      示例:

      COLUMN_UPDATE()>0  检查是否有列被更新。

      COLUMN_UPDATE()^21=0  检查是否更新了所有指定列(1、3、5)。

    创建触发器如下:

      CREATE TRIGGER UPDATECHECK2
      ON tb_Money
      FOR UPDATE
      AS
      IF COLUMNS_UPDATED()&7 = 3    --如果同时更新了Name,MyMoney才触发
      BEGIN
          PRINT('我的钱和姓名改变了!');
      END

      执行语句以及说明如下:

      UPDATE tb_Money SET Name = '张飞' WHERE Id = 1
    
      UPDATE tb_Money SET Name = '赵云', MyMoney = 102 WHERE Id = 1    --此行会激活触发器
      --计算过程如下
      --Id    Name    tb_Money
      --1        1        1    7(全部更新为7)
      --0        1        1    Name和tb_Money同时更新为(与3=3)
  • 相关阅读:
    ActiveMQ持久化机制
    ActiveMQ的使用
    ActiveMQ解释
    Linux CentOS安装Tomcat
    nginx使用Keepalived
    Session共享解决方案
    Spring框架AOP使用扩展
    Myabtis测试(二)错题整理分析
    初识Spring及打印机案例
    MyBatis注解
  • 原文地址:https://www.cnblogs.com/cxeye/p/4106030.html
Copyright © 2011-2022 走看看