如何为 AS400 表创建 SQL 触发器

Posted

技术标签:

【中文标题】如何为 AS400 表创建 SQL 触发器【英文标题】:How to create a SQL trigger for AS400 Table 【发布时间】:2018-01-30 13:03:47 【问题描述】:

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

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

【问题讨论】:

到目前为止你创造了什么? @Krismorte 我已经创建了 sql 触发器。我想将它添加到 As400 表中。 只是为了清楚 AS400 是表的名称吗?您正在使用哪个数据库? @Krismorte AS400 是带有 SQL 引擎的 IBM 服务器,因此我也可以执行 SQL 语句。 @Krismorte 它是 DB2,但它也有 SQL 引擎。 【参考方案1】:

IBM DB2 for i CREATE TRIGGER reference

您有几个选择,模式粒度

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

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

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

FOR EACH STATEMENT 指定数据库管理器执行 触发操作仅触发一次。即使 触发操作不修改或删除任何行,触发 动作仍然执行一次。无法指定 FOR EACH STATEMENT 对于 BEFORE 触发器。 FOR EACH STATEMENT 不能指定为 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 中,您最好尽可能执行基于集合的操作。

【讨论】:

非常感谢您的回答。每次TABLE_A 获得新记录时,我都需要触发触发器并将记录插入到TABLE_B。我可以用FOR EACH STATEMENT 做吗?你能告诉我TABLE_N是什么吗? 如果您一次只插入一行,那么FOR EACH STATEMENT MODE DB2SQL 一次只会将 1 行插入 TABLE_B。但是,如果要插入多行,则应使用 1 条语句插入它们。在这种情况下,上面将一次性将它们插入到 TABLE_B 中。 TABLE_N 是由单个 INSERT 插入到 TABLE_A 中的一组行 只是为了澄清,在我的例子中,有很多程序分别将数据插入到 TABLE_A。希望在使用 `FOR EACH STATEMENT MODE DB2SQ' 时不会出现问题? TABLE_N 是临时表还是应该使用与 TABLE_A 和 TABLE_B 相同的表结构来创建它? TABLE_N 是系统构建的,它将与 TABLE_A 具有相同的列...

以上是关于如何为 AS400 表创建 SQL 触发器的主要内容,如果未能解决你的问题,请参考以下文章

如何为总票数增加/减少 1 个数字创建更新触发器

sql server 的after触发器之insert触发器实例

如何为没有已知列的 PostgreSQL 视图编写通用更新触发器?

如何为我的触发器选择正确的行

语句触发器 PL/SQL

如何为已删除的项目编写触发器?