zoukankan      html  css  js  c++  java
  • SQL Server 觸發器(3)

         触发器是一种特殊的存储过程,与表格紧密相连。当用户修改表中的数据时,触发器将自动执行,触发器可以使用Transact-SQL语句进行复杂的逻辑处理,它基于一个表创建,但是可以对多个表进行操作,因此常常用于复杂的业务规则。创建触发器的语法如下:

    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 ] 

    }


    创建触发器语法中各参数的说明如表所示。

    表    创建触发器语法中的参数列表

    参数 说明
     
    trigger_name
     触发器的名称。触发器名称必须符合标识符规则,并且在数据库中必须惟一。可以选择是否指定触发器所有者名称
     
    Table | view
     在其上执行触发器的表或视图,有时称为触发器表或触发器视图。可以选择是否指定表或视图的所有者名称
     
    WITH ENCRYPTION
     加密syscomments表中包含CREATE TRIGGER语句文本的条目。使用WITH ENCRYPTION可防止将触发器作为SQL Server复制的一部分发布
     
    AFTER
     指定触发器只有在触发SQL语句中指定的所有操作都已成功执行后才激发。所有的引用级联操作和约束检查也必须成功完成后,才能执行此触发器
     
    INSTEAD OF
     指定执行触发器而不是执行触发SQL语句,从而替代触发语句的操作。

    在表或视图上,每个INSERT、UPDATE或DELETE语句最多可以定义一个INSTEAD OF触发器。然而,可以在每个具有INSTEAD OF触发器的视图上定义视图。

    INSTEAD OF触发器不能在WITH CHECK OPTION的可更新视图上定义。如果向指定了WITH CHECK OPTION选项的可更新视图添加INSTEAD OF触发器,SQL Server将产生一个错误。用户必须用ALTER VIEW删除该选项后才能定义INSTEAD OF触发器
     
    { [DELETE] [,] [INSERT] [,] [UPDATE] }
     指定在表或视图上执行哪些数据修改语句时将激活触发器的关键字。必须至少指定一个选项。在触发器定义中允许使用以任意顺序组合的这些关键字。如果指定的选项多于一个,需用逗号分隔这些选项

    对于INSTEAD OF触发器,不允许在具有ON DELETE级联操作引用关系的表上使用DELETE选项。同样,也不允许在具有ON UPDATE级联操作引用关系的表上使用UPDATE选项
     
    WITH APPEND
     指定应该添加现有类型的其他触发器。只有当兼容级别是65或更低时,才需要使用该可选子句。如果兼容级别是70或更高,则不必使用WITH APPEND子句添加现有类型的其他触发器
     
    NOT FOR REPLICATION
     表示当复制进程更改触发器所涉及的表时,不应执行该触发器
     
    AS
     触发器要执行的操作
     
    sql_statement
     触发器的条件和操作。触发器条件指定其他准则,以确定DELETE、INSERT 或UPDATE语句是否导致执行触发器操作。

    当尝试DELETE、INSERT或UPDATE操作时,Transact-SQL语句中指定的触发器操作将生效
     

    指定触发器何时触发分为以下两种情况:

    AFTER触发器在触发操作(INSERT、UPDATE或DELETE)后和处理完任何约束后触发。可通过指定AFTER或FOR关键字来请求 AFTER 触发器。因为FOR关键字与AFTER的效果相同,所以具有FOR关键字的触发器也归类为AFTER触发器。
    INSTEAD OF触发器代替触发动作进行触发,并在处理约束之前触发。对于每个触发操作(UPDATE、DELETE和INSERT),每个表或视图只能有一个INSTEAD OF触发器。而一个表对于每个触发操作可以有多个AFTER触发器。
       示例   触发器的建立与应用

    本示例实现的是,当对班级表进行删除操作时,其学生表中属于被删除班的学生信息自动删除。

    程序代码如下:

    IF EXISTS (SELECT name 
          FROM   sysobjects 
          WHERE  name = 'Trig_Del' 
          AND       type = 'TR')
        DROP TRIGGER Trig_Del
    GO
    CREATE TRIGGER Trig_Del
    ON t_TClass
    FOR DELETE
    AS
    BEGIN
       declare @ID varchar(10)
       select @ID=t_trigClss from deleted
       delete from t_TStu where t_trigClass=@ID
    END

  • 相关阅读:
    20165225《Java程序设计》第六周学习总结
    实验一 Java开发环境的熟悉
    20165225《Java程序设计》第五周学习总结
    移动web——bootstrap响应式工具
    移动web——bootstrap栅格系统
    移动web——bootstrap模板
    移动web——媒体查询
    移动web——轮播图
    移动web——touch事件应用
    移动web——touch事件介绍
  • 原文地址:https://www.cnblogs.com/Mayvar/p/wanghonghua_201104070826.html
Copyright © 2011-2022 走看看