欢迎访问文稿网!

创建触发器

范文之家 分享 时间: 加入收藏 我要投稿 点赞

创建触发器

    8.2.5 创建触发器

    创建触发器用CREATE TRIGGER语句,在SQL Server 中,CREATE TRIGGER的语法格式是:

    img136

    img137

    参数说明:

    ■ trigger_name

    表示触发器的名称,在数据库中必须唯一。

    ■ Table | view

    表示在其上执行触发器的表或视图,有时称为触发器表或触发器视图。

    ■ WITH ENCRYPTION

    使用WITH ENCRYPTION可防止将触发器作为 SQL Server 复制的一部分发布。

    ■ AFTER

    指定触发器只有在触发 SQL 语句中指定的所有操作都已成功执行后才激发。所有的引用级联操作和约束检查也必须成功完成后,才能执行此触发器。

    如果仅指定 FOR 关键字,则 AFTER 是默认设置。不能在视图上定义 AFTER 触发器。

    ■ INSTEAD OF

    指定执行触发器而不是执行触发 SQL 语句,从而替代触发语句的操作。

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

    ■ { [DELETE] [,] [INSERT] [,] [UPDATE] }

    指定在表或视图上执行哪些数据修改语句时将激活触发器的关键字。必须至少指定一个选项。在触发器定义中允许使用以任意顺序组合的这些关键字。如果指定的选项多于一个,需用逗号分隔这些选项。

    对于INSTEAD OF 触发器,不允许在具有 ON DELETE 级联操作引用关系的表上使用 DELETE 选项。同样,也不允许在具有 ON UPDATE 级联操作引用关系的表上使用 UPDATE 选项。

    ■ NOT FOR REPLICATION

    表示当复制进程更改触发器所涉及的表时,不应执行该触发器。

    ■ AS

    表示触发器要执行的操作。

    ■ sql_statement

    表示触发器的条件和操作。触发器条件指定其他准则,以确定 DELETE、INSERT 或 UPDATE 语句是否导致执行触发器操作。

    CREATE TRIGGER 语句中使用几个特殊的表:deleted和inserted是逻辑(概念)表。这些表在结构上类似于定义触发器的表;这些表用于保存用户操作可能更改的行的旧值或新值。例如,若要检索deleted表中的所有值,可使用SELECT * FROM deleted。

    ■ IF UPDATE (column)

    测试在指定的列上进行的 INSERT 或 UPDATE 操作,不能用于 DELETE 操作。可以指定多列。因为在 ON 子句中指定了表名,所以在 IF UPDATE 子句中的列名前不要包含表名。若要测试在多个列上进行的 INSERT 或 UPDATE 操作,请在第一个操作后指定单独的 UPDATE(column) 子句。在 INSERT 操作中 IF UPDATE 将返回 TRUE 值,因为这些列插入了显式值或隐性 (NULL) 值。可以在触发器主体中的任意位置使用 UPDATE (column)。

    ■ column

    表示要测试 INSERT 或 UPDATE 操作的列名。

    ■ IF (COLUMNS_UPDATED())

    测试是否插入或更新了提及的列,仅用于 INSERT 或 UPDATE 触发器中。COLUMNS_UPDATED 返回 varbinary 位模式,表示插入或更新了表中的哪些列。

    ■ bitwise_operator

    表示用于比较运算的位运算符。

    ■ updated_bitmask

    这是整型位掩码,表示实际更新或插入的列。例如,表 t1 包含列 C1、C2、C3、C4 和 C5。假定表 t1 上有 UPDATE 触发器,若要检查列 C2、C3 和 C4 是否都有更新,指定值 14;若要检查是否只有列 C2 有更新,指定值 2。

    ■ comparison_operator

    表示比较运算符。使用等号 (=) 检查 updated_bitmask 中指定的所有列是否都实际进行了更新。使用大于号 (>) 检查 updated_bitmask 中指定的任一列或某些列是否已更新。

    ■ column_bitmask

    表示检查的列的整型位掩码,用来检查是否已更新或插入了这些列。

    下面给出零售单表的INSERT、UPDATE和DELETE操作的触发器。通过触发器更新仓库存货的当前库存量。

    (1)创建插入“零售单”记录触发器

    img138

    可以利用前面建立的存储过程spUpdateCurrentQuantity,改写这个触发器。命令如下:

    img139

    (2)创建删除“零售单”记录触发器

    img140

    (3)创建更新“零售单”记录触发器

    我们只考虑零售数量变化的情况。对于变更,SQL Server是分为两步实现的,先删除变更前记录,然后添加一条变更后的记录。因此,触发器要用到deleted和inserted两个逻辑表。

      CREATE TRIGGER tr_tbRetailUpdate

      ON tbRetail

      FOR UPDATE

      AS BEGIN

    img141

221381
领取福利

微信扫码领取福利

微信扫码分享