现有两张表A和B,他们当中有一个字段f需要同步。当A中的f更新时,需要同步更新B中的f;
反之,当B中的f更新时,同样需要同步更新B中的f。刚一开始,我在A上建立了一个触发器t1,用于在A发生变化时更新B;
在B上同样建立了一个触发器t2,用于在B发生变化时更新A。可是这样会产生循环更新,发生死锁。对于这种同步更新的问题,还有什么好办法没有。

解决方案 »

  1.   

    在修改前 你可以判断old和new的值 只有当两个值不想等时才update 这样就可以避免死循环了
      

  2.   

    除了触发器,还有物化视图日志的方法,详见Google.
      

  3.   

    2个表中都加一个FLAG字段, 触发器里面置这个标记,更新时判断一下,可以避免死循环
      

  4.   

    在表A的触发器A中这样写
    select f into v_str from B where B.id = :new.id;--假设两个表通过id关联
    if (:new.f <> v_str) then
        update B set B.f = :new.f;
    end if;
    这样的话 应该不会死循环啊
      

  5.   

    总算解决了。多谢各位了(附上代码)。=========================================================================================
    create or replace trigger ta
      before update of name on a
      for each row
    declare
    begin
      if :new.flag = '0' then
        update b set name = :new.name, flag = '1' where id = :new.id;
      else
        :new.flag := '0';
      end if;
    end ta;create or replace trigger tb
      before update of name on b
      for each row
    declare
    begin
      if :new.flag = '0' then
        update a set name = :new.name, flag = '1' where id = :new.id;
      else
        :new.flag := '0';
      end if;
    end tb;=========================================================================================
      

  6.   

    也就是说,2个表都要加flag字段吗?
    感觉有点冗余,但暂没有更好办法.