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

  • 相关阅读:
    oracle 数据库服务名怎么查
    vmware vsphere 6.5
    vSphere虚拟化之ESXi的安装及部署
    ArcMap中无法添加ArcGIS Online底图的诊断方法
    ArcGIS中字段计算器(高级计算VBScript、Python)
    Bad habits : Putting NOLOCK everywhere
    Understanding the Impact of NOLOCK and WITH NOLOCK Table Hints in SQL Server
    with(nolock) or (nolock)
    What is “with (nolock)” in SQL Server?
    Changing SQL Server Collation After Installation
  • 原文地址:https://www.cnblogs.com/Mayvar/p/wanghonghua_201104070826.html
Copyright © 2011-2022 走看看