DB2在两个表之间保持n列同步

时间:2011-08-10 20:28:29

标签: db2

我有两个表(实际上是表集),可能需要保持同步(第一组表我需要将所有数据复制到第二组,其中这个数据将是一个子集)。

如果为什么重要(也许是因为显然不是很好的形式有复制数据),请参阅( PS '部分下的其他问题的最底层):DB2 update and insert trigger, references a lot of fields can I use * to shorten them (in iSeries but might not matter)

要做到这一点,我将把插入,更新和删除触发器放在我称之为“主要设置”的内容上,它将在“复制集”上插入,更新和删除记录。

我的问题是,如果我现在要保持复制集与主集同步?我现在正在查看文档以查看最佳方法。我不希望插入触发器尝试插入到最初插入的表中,因为我希望这会导致一个错误,这个错误将被报告回制作插入的程序,除非在触发器中有一种方法抛弃这样的报道?此时最好的方法就像检查删除前是否存在记录,插入相同。

然后有一个更新触发器的递归问题,我想知道是否有更优雅的解决方案,而不是检查值是否相同然后不更新?

不能以任何方式更改主集(除了不以任何方式修改表的输入/输出的触发器),而复制集的模式是完全灵活的。

优化懒惰(我可能会自动创建这些触发器,但如果你有关于如何保持它们紧凑的建议,那么它将加速我的开发。)

系统没有大量使用,它拥有免费资源的基调......几乎没有必要保守内存,处理和磁盘空间。

2 个答案:

答案 0 :(得分:1)

不使用复制表,而是使用视图会好得多。这将允许您将数据库访问与底层数据库设计完全分离。通过结合使用可更新/可删除视图和“代替”触发器,您应该能够很好地完成任务。请记住,这是推荐的设置,即使您只使用 SQL(以及任何语言),因为它允许您将程序设计与数据库设计分离。它允许您与iSeries PF分离的事实只是一个奖励。

好消息 - 您不必将所有内容切换为使用SQL - iSeries实际上是设置为允许您访问SQL对象(如视图和触发器),就像它是一个物理文件一样,具有本机RPG文件访问。
坏消息 - 与逻辑文件不同,视图无法排序。如果您对逻辑文件使用了大量的键控访问,那么您的工作可能很复杂......我还没有尝试使用CHAIN操作访问SQL索引,看看它是否允许我访问记录的其余部分,所以我不知道这是否有效。


编辑:

最后开始测试这个。事实证明,访问它们的排序索引(就像对于一个键控逻辑文件一样)确实会授予访问记录其余部分的权限。不确定这对你有帮助。

答案 1 :(得分:0)

我发布这个作为答案,使我在此时打算做的事情非常明确。任何改进都会被接受作为答案。

在两个表上实现插入,更新,删除之后的触发器。这样,引用约束将启动并准确地向用户报告。

删除和插入触发器必须检查记录是否已存在,以防止生成将发送回用户的错误。

更新触发器必须检查是否可以在应用更新之前更新记录以防止递归。

这是我打算使用的触发器的形式:

更新将同步两个表的触发器(当应用于每个表时),只有在记录不同步时才进行更新:

create trigger tableUpdate after update on fromSchema/tName  
 referencing new as n                                               
 for each row mode db2sql                                           
 begin atomic  
    update toSchema/tName target set (<-- all target.columns = n.columns -->)
         where <-- all target.column's != n.column's -->;   
end

插入将同步两个表的触发器(当应用于每个表时),仅在记录不存在时插入:

create trigger tableInsert after insert on fromSchema/tName  
 referencing new as n                                               
 for each row mode db2sql                                           
 begin atomic  
    insert into toSchema/tName select                      
     t1.*                                                  
    from fromSchema/tName as t1 left join toSchema/tName as t2
    on <-- t1.pkColumn's = t2.pkColumn's -->                                   
    where <-- t2.pkColum's IS NULL -->   
end

删除将同步两个表的触发器(当应用于每个表时),仅删除记录所在的位置:

create trigger utbachDelete after delete on fromSchema/tName  
 referencing old as o                                               
 for each row mode db2sql                                           
 begin atomic   
    delete from toSchema/tName target where <-- target.keyValues = o.keyValues -->;                                                           
end