如何为AS400表创建SQL触发器

时间:2018-01-30 13:03:48

标签: sql db2 database-trigger db2-400

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

修改 AS400是一个包含SQL引擎(DB2)

的IBM设备

1 个答案:

答案 0 :(得分:3)

IBM DB2 for i CREATE TRIGGER reference

您有几个选择,模式粒度

  

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

     

模式DB2ROW触发器在每个行操作上激活。 MODE DB2ROW   对于BEFORE和AFTER激活时间都有效。

     

FOR EACH ROW指定数据库管理器执行   触发动作为主题表的每一行触发   操作修改。如果触发操作没有修改任何   行,触发动作不会被执行。

     

FOR EACH STATEMENT指定数据库管理器执行   触发操作仅触发一次。即使是   触发操作不会修改或删除任何行,触发   动作仍然执行一次。无法指定每个声明   用于BEFORE触发器。无法为a指定每个语句   MODE DB2ROW触发器。

文档的REFERENCING子句有一个很好的表格,显示它们如何相互作用。

假设您的原始表已经完成了多行插入,那么每个语句触发一次触发器就可以获得性能......

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

如果一次只将一行插入TABLE_A,则两个语句一次将1行插入TABLE_B。

如果使用单个插入将10行插入TABLE_A,则FOR EACH STATEMENT MODE DB2SQL将一次插入10行到TABLE_B中;而FOR EACH ROW MODE DB2ROW将执行10次单独插入。

有时候,你必须使用FOR EACH ROW,例如BEFORE TRIGGER。

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