调用触发器过程的示例

下列示例定义三个表和一个在其 FOR 子句中引用这些表之一的触发器过程:
CREATE TABLE tab1 (col1 INT,col2 INT);
CREATE TABLE tab2 (col1 INT);
CREATE TABLE temptab1
   (old_col1 INTt, new_col1 INT, old_col2 INT, new_col2 INT);


        /* 在本示例中,从 INSERT 触发器调用下列过程。 
        */
CREATE PROCEDURE proc1()
REFERENCING OLD AS o NEW AS n FOR tab1; 

IF (INSERTING) THEN  -- INSERTING Boolean operator
        LET n.col1 = n.col1 + 1;   -- You can modify new values.
        INSERT INTO temptab1 VALUES(0,n.col1,1,n.col2);
END IF

IF (UPDATING) THEN  -- UPDATING Boolean operator
       -- you can access relevant old and new values. 
       INSERT INTO temptab1 values(o.col1,n.col1,o.col2,n.col2);
END IF

if (SELECTING) THEN  -- SELECTING Boolean operator
        -- you can access relevant old values.
        INSERT INTO temptab1 VALUES(o.col1,0,o.col2,0);
END IF

if (DELETING) THEN   -- DELETING Boolean operator
        DELETE FROM temptab1 WHERE temptab1.col1 = o.col1;
END IF

END PROCEDURE;
该示例说明触发操作可不同于触发事件的 DML 操作。虽然该过程在 Insert 触发器调用它时插入一行,并在 Delete 触发器调用它时删除一行,但如果由 Select 触发器或由 Update 触发器调用它,则还执行 INSERT 操作。

本示例中的 proc1( ) 触发器过程使用仅在触发器例程中才有效的 Boolean 条件运算符。仅当从 INSERT 触发器的 FOR EACH ROW 操作调用该过程时,INSERTING 运算符才返回真值。该过程还可从其触发器事件为 UPDATE、SELECT 或 DELETE 的其他触发器调用,因为如果在相应的触发事件类型触发的操作中调用该过程,则 UPDATING、SELECTING 和 DELETING 操作符返回真值(t)。

下列语句在 tab1 上定义 Insert 触发器,从 FOR EACH ROW 部分调用 proc1( ) 作为其触发的操作,并执行激活该触发器的 INSERT 操作:
CREATE TRIGGER ins_trig_tab1 INSERT ON tab1 REFERENCING NEW AS post
        FOR EACH ROW(EXECUTE PROCEDURE proc1() WITH TRIGGER REFERENCES);
      
请注意该触发器的 REFERENCING 子句为 NEW 子句声明一相关名称,不同于触发器过程声明的相关名称。这些名称无需匹配,因为在触发器过程中声明的相关名称是以那个过程作为其引用的作用域。下列语句激活 ins_trig_tab1 触发器,执行 proc1( ) 过程。
INSERT INTO tab1 VALUES (111,222);
      
由于触发器过程将 col1 的新值加 1,因此插入的值为 (112, 222),而不是触发事件指定的值。