Oracle触发器 ORA-04098:触发器无效,重新验证失败

我想在 Oracle 10g 数据库中创建一个简单的触发器。创建触发器的脚本运行得很干净。

CREATE OR REPLACE TRIGGER newAlert
AFTER INSERT OR UPDATE ON Alerts
  BEGIN
        INSERT INTO Users (userID, firstName, lastName, password) VALUES ('how', 'im', 'testing', 'this trigger')
  END;           
/

但当我运行

INSERT INTO Alerts(observationID, dateSent, message, dateViewed) VALUES (3, CURRENT_TIMESTAMP, 'Alert: You have exceeded the Max Threshold', NULL);

来激活触发器时,我得到了这样的错误信息:

ORA-04098:触发器 'JMD.NEWALERT'无效,重新验证失败 (0 行受影响)

我不明白是什么导致了这个错误。你知道是什么导致了这个错误吗?或者为什么会发生这种情况?

非常感谢!

-大卫

解决办法

Oracle 会尝试重新编译无效对象。这里的触发器是无效的,每次尝试插入记录时,都会尝试重新编译触发器,但都失败了,从而导致 ORA-04098 错误。

你可以 "select * from user_errors where type = 'TRIGGER' and name = 'NEWALERT'来查看触发器实际出了什么错误,以及为什么无法编译。在本例中,您似乎在insert` 行末尾缺少了一个分号:

INSERT INTO Users (userID, firstName, lastName, password)
VALUES ('how', 'im', 'testing', 'this trigger')

那就补上吧:

CREATE OR REPLACE TRIGGER newAlert
AFTER INSERT OR UPDATE ON Alerts
  BEGIN
        INSERT INTO Users (userID, firstName, lastName, password)
        VALUES ('how', 'im', 'testing', 'this trigger');
  END;           
/

如果出现编译警告,可以在 SQL*Plus 或 SQL Developer 中执行 "show errors",或再次查询 "user_errors"。

当然,这要假定你的 Users 表确实有这些列名,而且它们都是 varchar2......但你可能会用触发器做一些更有趣的事情。

评论(2)

原因:尝试检索一个触发器以执行,但发现该触发器无效。这也意味着触发器的编译/授权失败。

操作:可选择解决编译/授权错误、禁用触发器或放弃触发器。

语法

ALTER TRIGGER trigger Name DISABLE;

ALTER TRIGGER trigger_Name ENABLE;
评论(0)

在我的案例中,该错误是由于序列未创建而引起的。

CREATE SEQUENCE  J.SOME_SEQ  MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER  NOCYCLE ;
评论(0)