ORA-04079:无效的触发器规范

时间:2013-10-28 16:11:05

标签: sql oracle plsql triggers

我正在尝试创建一个触发器,用于在表中更新两个字段时对其进行审核。 我已经尝试编译PL / SQL,但以下错误不断出现。

ORA-04079: invalid trigger specification

参考其他SO问题,他们提到使用声明作为来解决此问题

CREATE OR REPLACE TRIGGER AUDIT_TRIGGER
BEFORE UPDATE OF MR_STATE, IS_EXEMPT
ON CX_MR mr
FOR EACH ROW
BEGIN
     IF UPDATING ('MR_STATE') THEN 
          INSERT INTO CX_AUDIT
          (
          INT_ID,
          FIELD_NAME,
          OLD_VAL,
          NEW_VAL,
          CHANGED_DATE,
          CHANGED_BY
          )
          VALUES
          (
          mr.INTEGRATION_ID,
          'MR_STATE',
          :old.MR_STATE,
          :new.MR_STATE,
          SYSDATE,
          'Trigger'
          );
     END IF;

    IF UPDATING ('IS_EXEMPT') THEN 
          INSERT INTO CX_AUDIT
          (
          INT_ID,
          FIELD_NAME,
          OLD_VAL,
          NEW_VAL,
          CHANGED_DATE,
          CHANGED_BY
          )
          VALUES
          (
          mr.INT_ID,
          'IS_EXEMPT',
          :old.IS_EXEMPT,
          :new.IS_EXEMPT,
          SYSDATE,
          'Multiroom'
          );
     END IF;
END;

但是我不确定我应该宣布什么,或者这是否是解决方案。

1 个答案:

答案 0 :(得分:1)

错误似乎是在表名CX_MR之后有一个额外的标记“mr”。您不能在触发器定义中为表名设置别名。

然后,您似乎继续尝试在触发器的主体中使用别名。删除“mr”标记后,触发器的标题应该编译,但在mr语句中使用INSERT时会出现编译错误。我不确定我是否理解你在那里尝试做什么,但是......你似乎知道如何使用:new:old伪记录来获得新旧值。我的猜测是你只需要:new.int_idINSERT语句中的mr.int_id。但是我不清楚你是否因某种原因而避免使用这种结构,以及你是否希望{{1}}有所不同。