创建历史记录触发器Db2

时间:2018-12-20 14:34:22

标签: db2

我正在尝试创建一个触发器,该触发器将一个新插入的和/或已更新的记录从一个表复制到该表的历史记录版本。目的是在每次插入和/或更新表中的记录时保留一条记录。

这是我在IBM Db2 Trigger站点之后的Create Trigger语句语法。

CREATE TRIGGER "TADB2"."HIST_CSEMASTER_Z_LOG"
AFTER UPDATE ON TADB2.CSEMASTER_Z
REFERENCING NEW AS N
FOR EACH ROW
BEGIN ATOMIC
INSERT INTO TADB2.HIST_CSEMASTER_Z
values (N.CSEMASTERID, N.CURRID, N.SUBCURRID, N.EXPIREDATE, N.CREATEDATE, N.CUSTVIEWNUM, N.CSEMSTRNAME, N.JOINCODE, N.CONTACTCOUNTRYCD, N.CONTACTSERIALNUM, N.AUDIENCECD, N.SPONSORNAME, N.AVAILABLEDATE, N.OWNERCOUNTRYCD, N.OWNERSERIALNUM, N.PRMWWCHAPTERID, N.PRMWWSUBCHAPTERID, N.SECWWCHAPTERID, N.SECWWSUBCHAPTERID, N.INTRANETIND, N.TINSERTTS, N.TLASTUPDTS, N.IBM_TRADEMARK, N.OTHER_TRADEMARK, N.INTERNETIND, N.BRANDID, N.BUSINESSID, N.LIFECYCLE_STATUS);
END;

我收到的错误是:

[代码:-104,SQL状态:42601]在“ N.LIFECYCLE_STATUS)”之后发现意外的标记“ END-OF-STATEMENT”。预期的令牌可能包括:“” .. SQLCODE = -104,SQLSTATE = 42601,DRIVER = 3.72.44

我尝试过:

  • 删除END
  • 在END之后删除分号
  • 在N.LIFECYCLE_STATUS之后删除分号);

任何帮助都会很棒!谢谢。

2 个答案:

答案 0 :(得分:1)

我强烈建议为此使用Db2临时表。如果您仅使用System Temporal功能,它将已经提供了您描述的功能。

值得一试

答案 1 :(得分:0)

您必须使用不同于';'的字符工具中的语句终止符。 下面是DB2命令行处理器的示例,该示例将第一行理解为执行此操作的指令。

--#SET TERMINATOR @
CREATE TRIGGER "TADB2"."HIST_CSEMASTER_Z_LOG"
AFTER UPDATE ON TADB2.CSEMASTER_Z
REFERENCING NEW AS N
FOR EACH ROW
BEGIN ATOMIC
  INSERT INTO TADB2.HIST_CSEMASTER_Z
  values (N.CSEMASTERID, N.CURRID, N.SUBCURRID, N.EXPIREDATE, N.CREATEDATE, N.CUSTVIEWNUM, N.CSEMSTRNAME, N.JOINCODE, N.CONTACTCOUNTRYCD, N.CONTACTSERIALNUM, N.AUDIENCECD, N.SPONSORNAME, N.AVAILABLEDATE, N.OWNERCOUNTRYCD, N.OWNERSERIALNUM, N.PRMWWCHAPTERID, N.PRMWWSUBCHAPTERID, N.SECWWCHAPTERID, N.SECWWSUBCHAPTERID, N.INTRANETIND, N.TINSERTTS, N.TLASTUPDTS, N.IBM_TRADEMARK, N.OTHER_TRADEMARK, N.INTERNETIND, N.BRANDID, N.BUSINESSID, N.LIFECYCLE_STATUS);
END@