问题描述
我想创建一个触发器,使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
)的结果确定的数据类型。您可以像普通表一样查询