我正在尝试创建一个触发器,用于在表中更新两个字段时对其进行审核。 我已经尝试编译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;
但是我不确定我应该宣布什么,或者这是否是解决方案。
答案 0 :(得分:1)
错误似乎是在表名CX_MR
之后有一个额外的标记“mr”。您不能在触发器定义中为表名设置别名。
然后,您似乎继续尝试在触发器的主体中使用别名。删除“mr”标记后,触发器的标题应该编译,但在mr
语句中使用INSERT
时会出现编译错误。我不确定我是否理解你在那里尝试做什么,但是......你似乎知道如何使用:new
和:old
伪记录来获得新旧值。我的猜测是你只需要:new.int_id
个INSERT
语句中的mr.int_id
。但是我不清楚你是否因某种原因而避免使用这种结构,以及你是否希望{{1}}有所不同。