ORA-04091: table 正在变异,trigger/function 在执行 oracle 触发器期间可能看不到它错误
ORA-04091: table is mutating, trigger/function may not see it error during execution of oracle trigger
我有下面的触发器,其中 FIELD_NAME
字段我想将值插入 FIELD_TRACKING
table 作为 'Deactivation time of KPI in case of Downtime(Select KPI_FREQ_TIME_UNIT FROM KPI_DEFINITION)'
。此字符串值中的括号部分来自 KPI_DEFINITION
table 的 KPI_FREQ_TIME_UNIT
字段。所以下面是我为此写的触发器。触发器编译没有任何错误。但是,当我尝试从 KPI_DEFINITION
table 更改 DNTM_REAC_AFTER_HRS
字段时,出现错误 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;
触发器无法读取 table(Select KPI_FREQ_TIME_UNIT FROM KPI_DEFINITION),更改...您可以通过这种方式访问值::new.KPI_FREQ_TIME_UNIT。
更多信息:http://www.dba-oracle.com/t_avoiding_mutating_table_error.htm
其他情况可以尝试在autonomous transaction:
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;
由于您需要来自 table 的信息,您为其创建了触发器(Select KPI_FREQ_TIME_UNIT FROM KPI_DEFINITION),您可以获得 KPI_FREQ_TIME_UNIT 来自参考 :NEW 因为它代表新行 (:NEW.KPI_FREQ_TIME_UNIT).
我有下面的触发器,其中 FIELD_NAME
字段我想将值插入 FIELD_TRACKING
table 作为 'Deactivation time of KPI in case of Downtime(Select KPI_FREQ_TIME_UNIT FROM KPI_DEFINITION)'
。此字符串值中的括号部分来自 KPI_DEFINITION
table 的 KPI_FREQ_TIME_UNIT
字段。所以下面是我为此写的触发器。触发器编译没有任何错误。但是,当我尝试从 KPI_DEFINITION
table 更改 DNTM_REAC_AFTER_HRS
字段时,出现错误 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;
触发器无法读取 table(Select KPI_FREQ_TIME_UNIT FROM KPI_DEFINITION),更改...您可以通过这种方式访问值::new.KPI_FREQ_TIME_UNIT。 更多信息:http://www.dba-oracle.com/t_avoiding_mutating_table_error.htm
其他情况可以尝试在autonomous transaction:
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;
由于您需要来自 table 的信息,您为其创建了触发器(Select KPI_FREQ_TIME_UNIT FROM KPI_DEFINITION),您可以获得 KPI_FREQ_TIME_UNIT 来自参考 :NEW 因为它代表新行 (:NEW.KPI_FREQ_TIME_UNIT).