表 XXX 发生了变化, 触发器/函数不能读它触发器是before delete;
在删除A表记录时,向B表插入要已删除的数据测试发现:update用:new没有问题,用:old就会报一样的错误

解决方案 »

  1.   

    楼主说的我很晕啊,
    你到底是delete还是update啊?
    先说new和old
    insert是插入数据,所以只会有new,
    delete是删除数据,所以只会有old,
    update是更新数据,所以new和old都有第二个问题,楼主为什么要用update来测试delete呢?
    楼主大概是认为update操作是一个先删除,然后再插入的操作吧.
      

  2.   

    触发器如下:create or replace
    TRIGGER tr_xxx_ud
      BEFORE UPDATE OR DELETE
       ON "XXXX"
       REFERENCING OLD AS OLD NEW AS NEW
       FOR EACH ROWDECLARE
      v_LogId number(15);
      v_today number;
      v_baseid number(15);
    BEGIN      v_today := func_today();
          v_baseid := v_today * 1000000;
          select nvl(max(LogId), v_baseid) into v_LogId
            from his_tb1
            where LogId between v_baseid and (v_baseid + 999999);      if updating then
              --备份历史
              insert into his_tb1(
                            logid,
                            loglabel,
                            logtime,
                            loghandler,
                            keyid,
                            keyname,
                            aliases,
                            sortfield,
                            enabled)
                  values(v_LogId + 1,
                          null,
                          sysdate,
                          null,
                          :new.keyid,
                          :new.keyname,
                          :new.aliases,
                          :new.sortfield,
                          :new.enabled);
          end if;      if deleting then
             --备份历史
              insert into his_tb1(
                            logid,
                            loglabel,
                            logtime,
                            loghandler,
                            keyid,
                            keyname,
                            aliases,
                            sortfield,
                            enabled)
                  values(v_LogId + 1,
                          null,
                          sysdate,
                          null,
                          :old.keyid,
                          :old.keyname,
                          :old.aliases,
                          :old.sortfield,
                          :old.enabled);      end if;
    END;
      

  3.   

    应该是  insert 触发器没有:old.
      delete  触发器没有:new.
      

  4.   

    1.你这报错是因为变异表的问题,触发器尝试读取正在发生改变的表时都会报这个错误。2.v_LogId 尝试不要取历史表里的最大值+1,建个序列让v_LogId取序列的值,这样就不会出错了。3.如果你非要取历史表的最大值+1,我只能告诉你这么做是可以实现的,但后果是,当多个用户同时对触发表操作时,后一个用户会等待前一个用户完成后才会执行,也就是本来可以并行操作的表变成了串行操作。如果你的系统是给10人以下的人操作的话,你可以这么干。给多人操作的话,你的系统性能会被拖慢的。