各位大神,关于触发器的,请教一个问题,有四张表A,B,C,D,四个表中都有一个字段X,想实现不管修改上述哪个表中的X值,其他三张表都自动触发更新,请问题有啥办法实现没?老是被锁住,感谢!

解决方案 »

  1.   

    被鎖正常,呵呵,因你更新其中一個表時,其他三個表在此表的觸發器中更新了,然後其他表的觸發器又做了相應的更新,被你整個死循環了這各設計應是不太合理的,按理一般這樣:表A,B,C,D的X字段來自一張表,如果這張表的此字段更新了,則A,B,C,D四個表都更新,這樣才是合理的設計
      

  2.   

    create or replace trigger tri_iud
    before insert or delete or update on table_a
    for each row
    begin 
     if inserting then 
        insert  tableB ( x)  values(:new.X);
        insert  tableC (x) values(:new.X);
        ...
      end if ;
      if  updating then
        update tableB  set x = :new.X where x =:OLD.x;
        update tabelC  set x =:new.X where x =OLD.X;
         ..
     end if ;
      if deleting then 
         delete from tableB where x=:old.x;
         delete from TableC where x =:old.x;
       ..
    end if 
    end tri_iud;
    /
        
      

  3.   

    表的设计有问题吧不建议用触发器,直接写四条update语句就行了,触发器比较影响性能。
      

  4.   

     有什么号的解决方法没?客户要求这么做,最好能实时,不实时可以用job,但是实时除了触发器还有啥技术实现没?谢谢!
      

  5.   

     这样的话,就死锁了,修改A,触发后去修改,B,C,D,但修改B的同时又触发修改A
      

  6.   

    在触发器中更新之前执行以下语句:
    select * from A where id=1 for update nowait;然后增加异常处理模块,如果遇到update冲突异常直接回滚。
      

  7.   

    最后解决方式为:建立了四个触发器,同时新建一个表A,用于存放共同的字段,无论更新哪个表,都去更新A,然后在A表中flag为0,更新完各个表后,置为2,在触发器中判断,若为2,则返回,同时增加了job,每隔1小时执行一次