首页 百科知识 创建触发器

创建触发器

时间:2022-10-17 百科知识 版权反馈
【摘要】:创建触发器用CREATE TRIGGER语句,在SQL Server 中,CREATE TRIGGER的语法格式是:指定触发器只有在触发 SQL 语句中指定的所有操作都已成功执行后才激发。所有的引用级联操作和约束检查也必须成功完成后,才能执行此触发器。在触发器定义中允许使用以任意顺序组合的这些关键字。表示触发器的条件和操作。测试是否插入或更新了提及的列,仅用于 INSERT 或 UPDATE 触发器中。下面给出零售单表的INSERT、UPDATE和DELETE操作的触发器。通过触发器更新仓库存货的当前库存量。

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

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈