如何为AS400表创建SQL触发器

如何为AS400表创建SQL触发器,sql,db2,database-trigger,db2-400,Sql,Db2,Database Trigger,Db2 400,我是Java开发人员,但不是RPG开发人员。对于我的一个项目,我需要在插入后为AS400表(表a)创建一个SQL,并将新创建的行复制到另一个表(表B)中。两个表具有相同的结构。 如果有人能指导我做这个过程,我真的很感激。请注意,我完全有权在AS400上执行任何类型的流程。提前谢谢 编辑 AS400是一个包含SQL引擎(DB2)的IBM设备 您有几个选择,模式和粒度 模式DB2SQL对AFTER触发器有效。触发器后的DB2SQL模式 在所有行操作发生后激活 模式DB2ROW触发器在每个行操作上都被

我是Java开发人员,但不是RPG开发人员。对于我的一个项目,我需要在插入后为
AS400
表(表a)创建一个SQL
,并将新创建的行复制到另一个表(表B)中。两个表具有相同的结构。
如果有人能指导我做这个过程,我真的很感激。请注意,我完全有权在AS400上执行任何类型的流程。提前谢谢

编辑 AS400是一个包含SQL引擎(DB2)的IBM设备

您有几个选择,模式粒度

模式DB2SQL对AFTER触发器有效。触发器后的DB2SQL模式 在所有行操作发生后激活

模式DB2ROW触发器在每个行操作上都被激活。模式DB2ROW 对于激活之前和之后的时间都有效

对于每一行,指定数据库管理器执行 触发的主题表的每一行的触发操作 操作修改。如果触发操作没有修改任何 行,则不会执行触发的操作

FOR EACH语句指定数据库管理器执行 触发操作仅触发一次。即使 触发操作不会修改或删除任何行,但会触发 操作仍然执行一次。不能指定FOR EACH语句 在触发之前。不能为一个实例指定FOR EACH语句 模式DB2ROW触发器

文档中的
引用
子句有一个很好的表,显示了它们是如何交互的

假设您的原始表已经完成了多行插入,那么每个语句触发一次触发器将提高性能

CREATE OR REPLACE TRIGGER TRIGGER_NAME AFTER INSERT
ON TABLE_A
  REFERENCING NEW TABLE AS TABLE_N 
  FOR EACH STATEMENT MODE DB2SQL

  begin atomic
    insert into TABLE_B 
      select * from TABLE_N;
  end
交替,一行一行

CREATE OR REPLACE TRIGGER TRIGGER_NAME AFTER INSERT
ON TABLE_A
  REFERENCING NEW ROW AS N 
  FOR EACH ROW MODE DB2ROW

  begin atomic
    insert into TABLE_B 
      values(n.col1, n.col2, n.col3, <....>);
  end
插入后创建或替换触发器名称
在桌子上
将新行引用为N
对于每行模式DB2ROW
开始原子化
插入到表B中
数值(n.col1,n.col2,n.col3,);
结束
如果一次仅将一行插入表_A,则两条语句将一次将一行插入表_B

如果用一次插入将10行插入表_A,则每个语句模式DB2SQL的
将一次将10行插入表_B;而
对于每行模式DB2ROW
将执行10个单独的插入

有时,您必须为每一行使用,例如BEFORE触发器


但是(通常)在SQL中,最好尽可能地执行基于集合的操作。

到目前为止您创建了什么?@Krismorte我已经创建了SQL触发器。我想将其添加到As400表中。请澄清As400是表的名称?您使用的是哪个数据库?@Krismorte AS400是一台带有SQL引擎的IBM服务器,因此我也可以执行SQL语句。@Krismorte它是DB2,但它也有SQL引擎。非常感谢您的回答。每次
TABLE_A
获得新记录时,我都需要触发触发器并将记录插入
TABLE_B
。我可以为每个语句使用
吗?您还可以告诉我什么是
表\N
?如果一次只插入一行,那么对于每个语句模式,DB2SQL
一次只会在表\B中插入一行。但是,如果要插入多行,则应使用一条语句插入它们。在这种情况下,上述操作将一次性将它们插入表_B中。TABLE_N是一组行,通过单个
INSERT
插入到TABLE_A中,仅用于澄清,在我的例子中,有这么多程序分别向表A插入数据。希望在使用“FOR EACH STATEMENT MODE DB2SQ”时不会出现问题?表N是临时表,还是应该使用与表A和表B相同的表结构创建它?表N是由系统构建的,它将具有与表A相同的列。。。