8.2.5 创建触发器
创建触发器用CREATE TRIGGER语句,在SQL Server 中,CREATE TRIGGER的语法格式是:
参数说明:
■ 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)创建插入“零售单”记录触发器
可以利用前面建立的存储过程spUpdateCurrentQuantity,改写这个触发器。命令如下:
(2)创建删除“零售单”记录触发器
(3)创建更新“零售单”记录触发器
我们只考虑零售数量变化的情况。对于变更,SQL Server是分为两步实现的,先删除变更前记录,然后添加一条变更后的记录。因此,触发器要用到deleted和inserted两个逻辑表。
CREATE TRIGGER tr_tbRetailUpdate
ON tbRetail
FOR UPDATE
AS BEGIN
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。