DB2更新和插入触发器,引用很多字段我可以使用*来缩短它们(在iSeries中但可能无关紧要)

时间:2011-08-10 18:13:23

标签: db2 ibm-midrange

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表中已经证明会导致问题并且系统管理员不想重新编译这些程序),所以所有表值都必须复制到新表中,这些表可以然后按照我们的预期使用而不会产生太大影响。这允许一定量的解耦,并让我们在如何管理架构方面有一些喘息的空间。

1 个答案:

答案 0 :(得分:1)

在查询中使用SELECT *格式绝不是一个好主意(ad-hoc dev-run除外,或者使用视图 - 应该被认为与API相同)。
特别是在将数据从一个文件移动到另一个文件时 - 如果更改原始文件但未更改(故意或意外)目标文件会发生什么? 我不知道从物理文件添加/删除触发器导致级别检查错误(意味着程序需要重新编译)的任何事情。如果您更改了文件的定义,因此需要更改触发器,则无论如何都需要重新编译程序(因为 更改了签名)。

如果你们真的对能够更新底层架构感兴趣,首选方法是定义视图(不是复制表),并使用SQL查询视图。完全这样做(据我所知),不需要通过PF更改重新编译RPG / RPGLE程序(尽管更改视图意味着需要更新内容......)