REFERENCING 子句

当创建 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_qtynew_qty 列提供值,必须能够引用 items 表中的 quantity 的旧值和新值。即,触发语句作用之前和之后的值。REFERENCING 子句可使您做的这一点。

REFERENCING 子句允许您创建可与列名组合起来的两个前缀,一个用于引用列的旧值,另一个用于引用列的新值。这些前缀称为相关名。可以根据您的要求创建一个或两个相关名。您指出使用关键字 OLD 和 NEW 创建的哪个相关名。下面的 REFERENCING 子句创建相关名 pre_updpost_upd 来引用行中的旧值和新值:
REFERENCING OLD AS pre_upd NEW AS post_upd
当更新 items 表中的某行中的 quantity 时,以下触发操作将在 log_record 中创建一行。INSERT 语句引用 item_numorder_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 语句。