DB2 on iSeries与DB2有点不同于其他平台,但就像我说的那样并不重要。
以下是我的以下触发器(有效)(一个区别是使用'/'vs'。'取决于用于创建查询的工具)
create trigger utbachInsert after insert on CO99PR/UTBACH
referencing new as n
for each row mode db2sql
begin atomic
insert into CO99PRH/UTBACH values(
n.BCGRP, n.BCID,n.BCSTAT,n.BCDESC,n.YYRGDT,
n.MMRGDT,n.DDRGDT,n.YY1EDT,n.MM1EDT,n.DD1EDT,
n.YYBLDT,n.MMBLDT,n.DDBLDT,n.YYPSDT,n.MMPSDT,
n.DDPSDT,n.YYPGDT,n.MMPGDT,n.DDPGDT,n.BCCOMM,
n.BCUSER,n.YYDATE,n.MMDATE,n.DDDATE
);
end
create trigger utbachUpdate after update on CO99PR/UTBACH
referencing new as n
for each row mode db2sql
begin atomic
update CO99PRH/UTBACH set
BCGRP = n.BCGRP,
BCID = n.BCID,
BCSTAT = n.BCSTAT,
BCDESC = n.BCDESC,
YYRGDT = n.YYRGDT,
MMRGDT = n.MMRGDT,
DDRGDT = n.DDRGDT,
YY1EDT = n.YY1EDT,
MM1EDT = n.MM1EDT,
DD1EDT = n.DD1EDT,
YYBLDT = n.YYBLDT,
MMBLDT = n.MMBLDT,
DDBLDT = n.DDBLDT,
YYPSDT = n.YYPSDT,
MMPSDT = n.MMPSDT,
DDPSDT = n.DDPSDT,
YYPGDT = n.YYPGDT,
MMPGDT = n.MMPGDT,
DDPGDT = n.DDPGDT,
BCCOMM = n.BCCOMM,
BCUSER = n.BCUSER,
YYDATE = n.YYDATE,
MMDATE = n.MMDATE,
DDDATE = n.DDDATE;
end
只需在上面的块中我需要输入很多,我很确定我已经使用select语句来获取其他插入触发器所需的条目,因为它是一个select语句我可以使用table1。 *(它加入了另一张桌子)。由于n引用旧行,我希望我可以说n。*或类似的东西。
如果你知道无法做到的话,我需要在很多地方这样做,我很乐意接受这个答案。
PS :有时候有上下文有帮助,我正在为一组表做这个以保持内容同步(在一个方向上)。这些表由使用记录级访问的程序使用(在DB2上使用SQL之前),更改表通常意味着重新编译使用它们的程序(删除或添加行,添加引用约束,甚至添加触发器)修改了来自这样一个程序的数据并将其放在SAME表中已经证明会导致问题并且系统管理员不想重新编译这些程序),所以所有表值都必须复制到新表中,这些表可以然后按照我们的预期使用而不会产生太大影响。这允许一定量的解耦,并让我们在如何管理架构方面有一些喘息的空间。
答案 0 :(得分:1)
在查询中使用SELECT *
格式绝不是一个好主意(ad-hoc dev-run除外,或者使用视图 - 应该被认为与API相同)。
特别是在将数据从一个文件移动到另一个文件时 - 如果更改原始文件但未更改(故意或意外)目标文件会发生什么?
我不知道从物理文件添加/删除触发器导致级别检查错误(意味着程序需要重新编译)的任何事情。如果您更改了文件的定义,因此需要更改触发器,则无论如何都需要重新编译程序(因为 更改了签名)。
如果你们真的对能够更新底层架构感兴趣,首选方法是定义视图(不是复制表),并使用SQL查询视图。完全这样做(据我所知),不需要通过PF更改重新编译RPG / RPGLE程序(尽管更改视图意味着需要更新内容......)