触发器支持XML

您可以使用CREATE TRIGGER SQL语句在XML列上创建BEFORE UPDATE或AFTER UPDATE触发器。 您也可以使用此语句在包含XML列的表上创建INSERT或DELETE触发器。

带有XML列的表格上的触发器有以下限制:
  • 过渡变量不能为XML类型。
  • 触发器主体中引用的转换表列不能为XML类型。
示例 :在表 MYCUSTOMER 上创建一个“更新前”触发器,该表是示例表 CUSTOMER 的副本。
CREATE TRIGGER UPDBEFORE 
  NO CASCADE BEFORE UPDATE ON MYCUSTOMER 
  REFERENCING NEW AS N 
  FOR EACH ROW MODE DB2SQL
  BEGIN ATOMIC 
    SET N.CID=O.CID+10000; 
  END
虽然MYCUSTOMER包含两个XML列,但过渡变量 N.CID 指向一个非XML列,因此该触发器有效。
示例 :在MYCUSTOMER表上创建一个INSERT触发器。
CREATE TRIGGER INSAFTR 
  AFTER INSERT ON MYCUSTOMER 
  REFERENCING NEW TABLE AS N 
  FOR EACH ROW MODE DB2SQL
  BEGIN ATOMIC 
    SELECT N.CID FROM N; 
  END

虽然转换表 N 有两个 XML 列,但触发器主体并未引用转换表的 XML 列,因此该触发器有效。

如果您需要在转换变量中使用 XML 列中的数据,则可以通过使用 XMLTABLE 函数将 XML 列中的数据作为非 XML 数据类型来访问,从而规避触发器中 XML 数据类型转换变量的限制。

示例 :假设CUST表定义如下:
CREATE TABLE CUST (
 ID   BIGINT NOT NULL PRIMARY KEY,
 NAME VARCHAR(30),
 CITY VARCHAR(20),
 ZIP  VARCHAR(12),
 INFO XML)
在CUST表上创建一个INSERT触发器,将插入到CUST表中的行的姓名、城市和邮政编码信息复制到自身。 您需要复制的数据位于XML列INFO中。 您不能在触发器正文中直接引用 INFO。 不过,您可以使用XMLTABLE函数创建一个结果表,其中包含非XML列,这些列包含您需要的字段。 然后,您可以使用子选择来检索结果表中与触发器激活的插入操作相对应的行。
CREATE TRIGGER INS_CUST
   AFTER INSERT ON CUST
   REFERENCING NEW AS NEWROW
   FOR EACH ROW MODE DB2SQL
   BEGIN ATOMIC
     UPDATE CUST
       SET (NAME, CITY, ZIP) =
           (SELECT X.NAME, X.CITY, X.ZIP
             FROM CUST, XMLTABLE('CUSTOMERINFO' PASSING CUST.INFO
                   COLUMNS
                     NAME VARCHAR(30)  PATH 'NAME',
                     CITY VARCHAR(20)  PATH 'ADDR/CITY',
                     ZIP  VARCHAR(12)  PATH 'ADDR/PCODE-ZIP') AS X
             WHERE CUST.ID = NEWROW.ID        
             )
       WHERE CUST.ID = NEWROW.ID;
   END