我该如何修复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;

该如何解决?

解决方法

同一行?就是这样:

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

您看到您应该使用 BEFORE 之前的INSERT触发器,因为这样您仍然可以操纵新数据。

,

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

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

不必担心已经基于表达式(INT)的结果确定的数据类型。您可以像普通表一样查询

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...