当创建 FOR EACH ROW 触发操作时,通常必须在触发操作语句中指示您引用的是触发语句生效之前还是之后的列值。例如:假定您想要跟踪对
items 表的
quantity
列的更新。为此,创建下表以记录该活动:
CREATE TABLE log_record
(item_num SMALLINT,
ord_num INTEGER,
username CHARACTER(8),
update_time DATETIME YEAR TO MINUTE,
old_qty SMALLINT,
new_qty SMALLINT);
要为此表中的 old_qty 和 new_qty 列提供值,必须能够引用 items 表中的 quantity
的旧值和新值。即,触发语句作用之前和之后的值。REFERENCING 子句可使您做的这一点。
REFERENCING
子句允许您创建可与列名组合起来的两个前缀,一个用于引用列的旧值,另一个用于引用列的新值。这些前缀称为
相关名。可以根据您的要求创建一个或两个相关名。您指出使用关键字 OLD
和 NEW 创建的哪个相关名。下面的 REFERENCING 子句创建相关名
pre_upd 和
post_upd
来引用行中的旧值和新值:
REFERENCING OLD AS pre_upd NEW AS post_upd
当更新
items 表中的某行中的
quantity 时,以下触发操作将在
log_record 中创建一行。INSERT 语句引用
item_num 和
order_num 列的旧值并引用
quantity
列的新值和旧值。
FOR EACH ROW(INSERT INTO log_record
VALUES (pre_upd.item_num, pre_upd.order_num, USER,
CURRENT, pre_upd.quantity, post_upd.quantity));
在 REFERENCING 子句中定义的相关名应用于触发语句作用的所有行。
重要: 如果引用未被相关名限定的列名,数据库服务器不会专门在触发表的定义中搜索该列。必须总是将相关名与 FOR EACH ROW 触发操作中的 SQL
语句中的列名结合使用,除非该语句独立有效,而与触发操作无关。有关更多信息,请参阅 GBase 8s SQL 指南:语法中的 CREATE TRIGGER 语句。