Sql ORA-04079:触发器规范无效
我试图创建一个触发器,在表中更新两个字段时对它们进行审核。 我已经尝试编译PL/SQL,但是下面的错误不断出现Sql ORA-04079:触发器规范无效,sql,oracle,plsql,triggers,Sql,Oracle,Plsql,Triggers,我试图创建一个触发器,在表中更新两个字段时对它们进行审核。 我已经尝试编译PL/SQL,但是下面的错误不断出现 ORA-04079: invalid trigger specification 参考其他SO问题,他们提到使用Declare或As解决此问题 CREATE OR REPLACE TRIGGER AUDIT_TRIGGER BEFORE UPDATE OF MR_STATE, IS_EXEMPT ON CX_MR mr FOR EACH ROW BEGIN IF UPDAT
ORA-04079: invalid trigger specification
参考其他SO问题,他们提到使用Declare或As解决此问题
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;
但是,我不确定我应该声明什么,或者这是否是解决方案。错误似乎是在表名
CX\u mr
之后有一个额外的标记“mr”。不能在触发器定义中为表名添加别名
然后,您似乎继续尝试使用触发器主体中的别名。删除“mr”标记后,触发器的头应该会编译,但在
INSERT
语句中使用mr
时会出现编译错误。我不确定我是否理解你在那里试图做什么,尽管。。。您似乎知道如何使用:new
和:old
伪记录来获取新旧值。我猜您只需要在两个INSERT
语句中使用:new.int\u id
。但我不清楚您是否出于某种原因避免使用该构造,以及您是否希望mr.int\u id
有所不同。在我的cx\u audit和cx\u mr表中,两个主键都是“int\u id”,我想防止plsql@serupticious-我没听懂。如果int\u id
是cx\u audit
中的主键,则必须从每个INSERT
的序列生成它,并且它与cx\u mr
表中的int\u id
列没有关系。这似乎不太可能是正确的。您是否希望mr.int\u id
与:new.int\u id
有所不同?在放置新的.int\u id而不仅仅是列名后,它现在可以工作了。谢谢