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

ORA-04091:表正在发生变化,触发器/函数在执行oracle触发器时可能看不到错误,oracle,triggers,sql-insert,Oracle,Triggers,Sql Insert,我有以下触发器,在该触发器中,对于字段\名称字段,我希望将值插入字段\跟踪表中,作为“停工时KPI的停用时间从KPI \定义中选择KPI \频率\时间\单位”。此字符串值中的括号部分来自KPI\u定义表的KPI\u频率\u时间\u单位字段。下面是我为此编写的触发器。触发器编译时没有任何错误。但是,当我试图从KPI_定义表中更改DNTM_REAC_AFTER_HRS字段时,我得到错误ORA-04091:表OR_MONITORING_CONFIGURATION.KPI_定义正在发生变化,触发器/函数

我有以下触发器,在该触发器中,对于字段\名称字段,我希望将值插入字段\跟踪表中,作为“停工时KPI的停用时间从KPI \定义中选择KPI \频率\时间\单位”。此字符串值中的括号部分来自KPI\u定义表的KPI\u频率\u时间\u单位字段。下面是我为此编写的触发器。触发器编译时没有任何错误。但是,当我试图从KPI_定义表中更改DNTM_REAC_AFTER_HRS字段时,我得到错误ORA-04091:表OR_MONITORING_CONFIGURATION.KPI_定义正在发生变化,触发器/函数可能看不到它ORA-04088:执行触发器“OR_MONITORING_CONFIGURATION.TRG_TRK_KPI_DEFINITION”时出错


触发器无法从KPI\U定义中读取表Select KPI\U FREQ\U TIME\U UNIT,该表将更改。。。您可以通过以下方式访问该值::new.KPI\u FREQ\u TIME\u UNIT。 更多信息:

在其他情况下,您可以尝试在以下情况下执行此操作:


由于您需要从为其创建触发器的表中获取信息,以便从KPI\u定义中选择KPI\u频率\u时间\u单位,您可以从引用:NEW中获取KPI\u FREQ\u TIME\u单位,因为它表示新行:NEW.KPI\u FREQ\u TIME\u单位。

是的,我现在进行更改,它显示实际错误,错误是单行查询返回多行。有多少行返回此查询:从KPI\u定义中选择KPI\u FREQ\u TIME\u单位?它返回多行。我已经解决了这个问题,但现在的问题是,我有50多个字段,if语句是否需要在每个if语句中提供commit?因为一旦我声明PRAGMA autonomy_TRANSACTION并且没有提交,它就会给出一个错误,因为保存对表的更改时出错。KPI_定义:第1行:ORA-06519:检测到并回滚活动的自治事务是,在这种情况下,您必须提交它。。。你有没有想过用DBMS_作业来代替这个触发器。我只是在END之前的触发器底部添加commit,而不是在每个if语句中。它可以工作,但不会引起任何问题,对吗?
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;
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;