我有两张表,A表 和 B表,A表和B表都有一个parentid字段,表示父级ID,现在我写一个触发器(建在A表上)当对A表做增,删,改时分别对相应的数据在B表做同步触发,A表和B表只有NAME字段是一样的,当我向A表插入数据时,肯定要根据A表的parentid来找到A表parentid.name,然后才能找到B表对应的name,进而找到B表对应的id,这样往B表插入数据的时候,才可以有B表的parentid,现在是我访问A表后就会报ORA-04091: 表 HNTELANT.XB_UIMCARD 发生了变化, 触发器/函数不能读它错误,各位有什么好招,急求解,重赏!!
触发器很长很长,我写几个关键的吧
A 表结构id ,name ,parentid,
B 表结构id ,name ,parentid,注意A表和B表的id都是取的自身的sequence的,不一定相同.但A,B表的数量以及name都是一样的.
建触发器 on A:
select name into v_name from A where ID IN (
SELECT parentid from a where id = :new.id);--找到A表父级name,--这一句异常,对自身触发表操作了select id into v_id from B where name = v_name;通过A表父级name,找到B表父级idinsert into b(id,name,parentid) values(s_b.nextval,:new.name,v_id );--如果做插入,同步数据到B表.有什么好的解决方法,不用访问自身表!

解决方案 »

  1.   

    可以使用自治事务,在触发器说明部分加上PRAGMA AUTONOMOUS_TRANSACTION;
    如:
    CREATE OR REPLACE TRIGGER tr_emp1
      AFTER INSERT OR UPDATE ON emp1
      FOR EACH ROW
    DECLARE
      v_ename emp1.ename%TYPE;
      PRAGMA AUTONOMOUS_TRANSACTION;
    BEGIN
      SELECT t.ename INTO v_ename FROM emp1 t WHERE empno = :new.mgr;
      dbms_output.put_line(v_ename);
    END;
    /
    建议不要依赖触发器,其实可以在业务侧或者通过存储过程在一个事务内来完成。