INSERT 事件和 DELETE 事件
表上的 INSERT 和 DELETE 事件由那些关键字和 ON table 子句定义,使用以下语法。
在表上 INSERT 或 DELETE 事件
元素 | 描述 | 限制 | 语法 |
table | 触发表的名称 | 必须在数据库中存在 | 标识符 |
当 INSERT 语句在其 INTO 子句中包含指定的 table (或 table 的同义词)时, Insert 触发被激活。同样地,当 DELETE 语句在其 FROM 子句中包含指定的 table (或 table 的同义词)时,Delete 触发器被激活。
如果 Insert 触发器指定的 table 是包含 Insert 子句的 MERGE 语句的目标表,则 MERGE 语句也可以激活 Insert 触发器,同样地,如果 Delete 触发器指定的 table 是包含 Delete 子句的 MERGE 语句的目标表,则 MERGE 语句也可以激活 Delete 触发器。
当 TRUNCATE TABLE 语句删除表的所有行时,它不会激活 Delete 触发器。如果要对一个表定义启用的 Delete 触发器,而您不具有此表的 Alter 特权,则如果您视图移除此表,即使 TRUNCATE 语句不是 Delete 触发器的触发事件,数据库服务器仍会返回错误。(有关删除操作所需的自由访问权的更多信息,请参阅 TRUNCATE 语句。)
对于视图上的触发器,INSTEAD OF 关键字必须紧跟在指定触发事件类型的 INSERT 、DELETE 或 UPDATE 关键字之前,且视图(而不是表)的名称或同义词必须跟在 ON 关键字之后。视图上的 INSTEAD OF 触发器部分描述定义 INSTEAD OF 触发事件的语法。
一个表上可以定义多个 Insert 触发器和多个 Delete 触发器。
如果您在表层次结构中的子表上定义触发器,且子表支持级联删除,则超级表上的 DELETE 操作将激活子表上的 Delete 触发器。
关于 Insert 触发器和 Delete 触发器的操作上的相关性和限制的信息,另请参阅触发器的再进入一节。
UPDATE 事件
UPDATE 事件(和 SELECT 事件)可以包含可选的 column 列表、
UPDATE 事件
元素 | 描述 | 限制 | 语法 |
column | 激发触发器的列 | 必须在触发表中存在 | 标识符 |
table | 触发表的名称 | 必须数据库中存在 | 标识符 |
column 列表是可选的。如果您忽略 OF column 列表,则更改 table 的任何列都将激活触发器。
OF column 子句对于视图上的 INSTEAD OF 触发器是无效的。
在两种情况下,触发表上的 UPDATE 可以激活触发器:
- UPDATE 语句引用 column 列表中的任何列。
- UPDATE 事件定义未指定 OF column 列表规范。
无论它更新 column 列表中的一列还是激活多列,触发 UPDATE 语句都只激活 Update 触发器一次。
如果指定没有 columns 列的触发器 table 是 MERGE 语句的目标表,或者如果 MERGE 语句的 Update 子句引用了Update 触发器的 column 列表中的列,则 MERGE 语句也可以激活 Update 触发器。
定义多个 Update 触发器
一个表上的多个 Update 触发器不能包含相同的列。在以下示例中,trig3 在 items 表上是无效的,因为它的列列表包含 stock_num ,而 stock_num 是 trig1 中的触发列。
CREATE TRIGGER trig1 UPDATE OF item_num, stock_num ON items
REFERENCING OLD AS pre NEW AS post
FOR EACH ROW(EXECUTE PROCEDURE proc1());
CREATE TRIGGER trig2 UPDATE OF manu_code ON items
BEFORE(EXECUTE PROCEDURE proc2());
CREATE TRIGGER trig3 UPDATE OF order_num, stock_num ON items
BEFORE(EXECUTE PROCEDURE proc3());
当 UPDATE 语句尝试更新具有不同触发器的多个列时,触发列的列编号确定触发执行的顺序。从编号最小的触发列开始执行,且按顺序一直执行到编号最大的触发列。但是,如果在同一列或同一组列上设置了多个 Update 触发器,则不保证触发器的执行顺序。
以下示例显示表 taba 具有四列(a 、 b 、 c 、 d):
CREATE TABLE taba (a int, b int, c int, d int);
将 trig1 定义为列 a 和 c 上的更新,将 trig2 定义为列 b 和 d 上的更新,如以下示例所示:
CREATE TRIGGER trig1 UPDATE OF a, c ON taba
AFTER (UPDATE tabb SET y = y + 1);
CREATE TRIGGER trig2 UPDATE OF b, d ON taba
AFTER (UPDATE tabb SET z = z + 1);
以下示例显示 Update 触发器的触发语句:
UPDATE taba SET (b, c) = (b + 1, c + 1);
然后列 a 和 c 的 trig1 首先执行,列 b 和 d 的 trig2 随后执行。在此情况中,触发器中列编号最小的是第 1 列(a),第二小的是第 2 列(b)。