oracle - ORA-04082:表格级触发器中不允许使用NEW或OLD引用

标签 oracle triggers

我有每个名为的表。在每个表的中,我有一个名为“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”的值是否更改,都用“fl1”的值简单地更新“fl2”的值。

更新

添加了“对于每一行”,并将“插入或更新之前”更改为“插入或更新之后”。工作正常
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;

最佳答案

DML触发器定义为表级别或行级别。

表级触发器将对表上的每个操作触发一次,因此,如果您更新30行,那么就表触发器而言,这是一个操作。表触发器不了解要修改哪些行,但可以用来记录操作已执行的事实。

在这种情况下,您需要一个行级触发器,该触发器要求在触发器定义中包括“FOR EACH ROW”。如果您不想更改引用新行和旧行的方式,则“REFERENCING”子句是可选的。

http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/triggers.htm#BABCIBBJ

不过,不确定此处的练习重点是什么。您是否考虑过仅引用fl1而不是fl2?

关于oracle - ORA-04082:表格级触发器中不允许使用NEW或OLD引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18741342/

相关文章:

sql - 将 VARCHAR2 转换为数字

sql - 合并oracle或db2中两个表之间的日期范围

java - ORA-01003 : no statement parsed

sql - 使用列与另一个列进行评估 oracle

PostgreSQL 使用变量名作为字符串文字

sql - SQL 存储过程中的 "referencing old"和 "referencing new"有什么区别?

oracle - 尝试使用DBMS_DDL.ALTER_COMPILE时出现ORA-20000错误

mysql - 创建触发器时出现分隔符奇怪错误

sql - Postgres 触发器函数 ON CONFLICT 更新另一个表

sql-server - 创建一个不允许更新主键列的触发器