ORA-04091: 表正在发生变化,触发器/函数在执行 Oracle 触发器期间可能看不到它错误

And*_*rew 6 oracle triggers sql-insert

我有下面的触发器,其中FIELD_NAME我想将字段值插入FIELD_TRACKING表中'Deactivation time of KPI in case of Downtime(Select KPI_FREQ_TIME_UNIT FROM KPI_DEFINITION)'。该字符串值中的括号部分来自表KPI_FREQ_TIME_UNIT的字段KPI_DEFINITION。下面是我为此编写的触发器。触发器编译没有任何错误。但是当我尝试更改表DNTM_REAC_AFTER_HRS中的字段KPI_DEFINITION时,我收到错误ORA-04091: table RATOR_MONITORING_CONFIGURATION.KPI_DEFINITION is mutating, trigger/function may not see it ORA-04088: error during execution of trigger 'RATOR_MONITORING_CONFIGURATION.TRG_TRK_KPI_DEFINITION'

create or replace TRIGGER RATOR_MONITORING_CONFIGURATION."TRG_TRK_KPI_DEFINITION" AFTER UPDATE ON RATOR_MONITORING_CONFIGURATION.KPI_DEFINITION
      FOR EACH ROW

    IF NOT  :old.DNTM_REAC_AFTER_HRS=:new.DNTM_REAC_AFTER_HRS THEN
        INSERT INTO RATOR_MONITORING_CONFIGURATION.FIELD_TRACKING  (FIELD_TRACKING_ID,TABLE_NAME,TABLE_ID, FIELD_NAME,FIELD_OLD_VALUE,FIELD_NEW_VALUE,USER_ID, TIMESTAMP, FIELD_TRACKING_COMMENTS)
        VALUES (FIELD_TRACKING_SEQ.NEXTVAL,'KPI_DEFINITION',:new.KPI_DEF_ID,'Deactivation time of KPI in case of Downtime'|| '(' || to_char((Select KPI_FREQ_TIME_UNIT FROM KPI_DEFINITION)) || ')',to_char(:old.DNTM_REAC_AFTER_HRS),to_char( :new.DNTM_REAC_AFTER_HRS),:new.LAST_UPDATED_BY,:new.LAST_UPDATED_DATE, decode(:new.KPI_ACTIVE_DOWNTIME,'N','This KPI has been reactivated on end of a downtime.',''));
      END IF;

    END;
Run Code Online (Sandbox Code Playgroud)

wil*_*oop 8

触发器无法读取表(从 KPI_DEFINITION 选择 KPI_FREQ_TIME_UNIT),该表发生变化...您可以通过以下方式访问该值::new.KPI_FREQ_TIME_UNIT。更多信息:http://www.dba-oracle.com/t_avoiding_mutating_table_error.htm

在其他情况下,您可以尝试在自治事务中执行此操作:

create or replace TRIGGER RATOR_MONITORING_CONFIGURATION."TRG_TRK_KPI_DEFINITION" 
AFTER UPDATE ON RATOR_MONITORING_CONFIGURATION.KPI_DEFINITION FOR EACH ROW
DECLARE
   PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  -- ...
  COMMIT; -- don't forget it!!!
END;
Run Code Online (Sandbox Code Playgroud)