【发布时间】:2013-09-15 11:40:52
【问题描述】:
我有一个名为 per 的表。在 per 表中,我有一个名为“fl1”的字段和另一个名为“fl2”的字段。更新记录时,我想检查“fl1”的值是否发生了变化。如果值发生了变化,请使用“fl1”中的新值更新“fl2”列。
我想出了这个触发器
CREATE OR REPLACE TRIGGER Flag
AFTER INSERT OR UPDATE on per
REFERENCING NEW AS NEW OLD AS OLD
BEGIN
If :New.fl1 != :Old.fl1 Then
:New.fl2:= :new.fl1;
End If;
END;
我在运行时收到“ORA-04082:表级触发器中不允许新或旧引用”
我正在考虑的另一个选项(不确定它是否有效)是简单地用“fl1”的值更新“fl2”的值,而不管“fl1”的值是否发生了变化。
更新
添加了“对于每一行”并将“插入或更新之后”更改为“插入或更新之前”。它正在工作。
CREATE OR REPLACE TRIGGER Flag
BEFORE INSERT OR UPDATE on per
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
BEGIN
If :New.fl1 != :Old.fl1 Then
:New.fl2:= :new.fl1;
End If;
END;
【问题讨论】:
-
如果您有答案,您应该将其发布为作为答案,而不是作为问题的更新。然后,您可以(在强制延迟之后,IIRC)将答案标记为已接受。这让人们知道您还没有在寻找答案。
-
次要注意 - 错误消息不正确。没有“表级”触发器;如果触发器不是行级触发器,则它仅适用于受 DML 语句影响的行。我总是看到这些被称为“语句级触发器”。错误信息很有趣。