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

时间:2014-03-26 17:21:00

标签: sql oracle oracle10g 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行受影响)

我不明白什么导致了这个错误。你知道导致这个错误的原因吗?或者为什么会这样?

提前谢谢!

-David

3 个答案:

答案 0 :(得分:35)

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;           
/

如果您在执行此操作时收到编译警告,则可以执行show errors(如果您使用的是SQL * Plus或SQL Developer),或再次查询user_errors

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

答案 1 :(得分:2)

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

操作:选项用于解决编译/授权错误,禁用触发器或删除触发器。

语法

ALTER TRIGGER trigger Name DISABLE;

ALTER TRIGGER trigger_Name ENABLE;

答案 2 :(得分:0)

在我的情况下,由于未创建序列而引发此错误..

CREATE SEQUENCE  J.SOME_SEQ  MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER  NOCYCLE ;