【问题标题】:ORA-04091: table is mutating, trigger/function may not see it ORA-06512ORA-04091: 表正在变异,触发器/函数可能看不到它 ORA-06512
【发布时间】:2015-06-28 21:37:14
【问题描述】:

当在另一个表上进行插入时,我创建了一个触发器来在一个表中插入一个日志。

这是触发器的代码:

CREATE OR REPLACE TRIGGER scheme1.Inserting_Feed 
          AFTER INSERT ON scheme2.payments FOR EACH ROW
BEGIN
  INSERT INTO scheme2.db-logger(ID, TECHNOLOGY, WORKFLOW, NAME_EVENT, TIME_EVENT)
  VALUES(:NEW.id,'Repository','UP',(select repo.name 
                                      from scheme1.repository repo 
                                      join scheme2.payments pay 
                                        on repo.id = pay.repository_id
                                     where repo.id = NEW.repository_id), SYSDATE);
END;

我尝试运行此触发器,但是当我在表支付上进行插入时,我收到以下错误:

错误 MT101-GENERAL_LOAD_ERROR: java.sql.SQLSyntaxErrorException: ORA-04091: 表 scheme1.payments 正在变异,触发器/函数可能 看不到它 ORA-06512:在“scheme1.Inserting_Feed”,第 2 行 ORA-04088: 执行触发器“scheme1.Inserting_Feed”时出错

我的理解是错误表示表正在更改,但触发器没有看到它。这是怎么来的?

【问题讨论】:

    标签: oracle triggers insert


    【解决方案1】:

    为什么在insert语句的子查询中加入scheme2.payments表?你就不能这样做吗:

    CREATE OR REPLACE TRIGGER scheme1.inserting_feed
      AFTER INSERT
      ON scheme2.payments
      FOR EACH ROW
    BEGIN
      INSERT INTO scheme2.db_logger (id,
                                     technology,
                                     workflow,
                                     name_event,
                                     time_event)
        VALUES      ( :new.id,
                      'Repository',
                      'UP',
                      (SELECT repo.name
                       FROM   scheme1.repository repo
                       WHERE  repo.id = :new.repository_id),
                      SYSDATE);
    END;
    /
    

    【讨论】:

    • 使用此代码,我在触发器插入中得到一个空值,我的字段不能为空,因此它会引发异常
    猜你喜欢
    • 1970-01-01
    • 2010-09-27
    • 2013-11-24
    • 2016-08-11
    • 1970-01-01
    • 2016-02-24
    • 2022-10-20
    • 2021-12-20
    相关资源
    最近更新 更多