首页 > 解决方案 > 如何修复 ORA-04091:表正在变异,触发器/函数可能看不到它?

问题描述

我想创建一个触发器,使 trgr 的值等于同一行上 seq+100 的值。这就是我所做的,但我不断收到错误“表正在变异,触发器/函数可能看不到它”。

CREATE OR REPLACE TRIGGER update_tgr
AFTER INSERT ON challenge FOR EACH ROW
BEGIN
    UPDATE challenge
        SET trgr = :NEW.seq + 100
        WHERE seq = :NEW.seq;
END;

我能做些什么来修复它?

标签: oracleplsqltriggers

解决方案


Virtual Column如果您的数据库版本是 11g+,我认为创建一个更好的选择。因为不需要在磁盘上存储已经可以计算的列。trgr与传统定义样式不同,这可以防止为列 ( ) 插入错误值的可能性。然后,您可以重新创建表,例如

CREATE TABLE challenge (
  .....
  seq         INT,
  trgr        AS (seq + 100), -- [VIRTUAL]
  ----
);

无需担心已经根据表达式(INT)的结果确定的数据类型。可以像普通表一样查询


推荐阅读