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

use*_*162 21 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;           
/
Run Code Online (Sandbox Code Playgroud)

但是当我跑步时:

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

要激活触发器,我收到以下错误消息:

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

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

先感谢您!

-大卫

Ale*_*ole 37

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')
Run Code Online (Sandbox Code Playgroud)

所以做到:

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;           
/
Run Code Online (Sandbox Code Playgroud)

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

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

  • 非常感谢!作为一名java开发人员,我特别尴尬的是我的错误是缺少分号.哈哈 (7认同)
  • 我不知道触发器错误的 select 子句,+1,而且您也可以运行“SHOW ERRORS TRIGGER trigger_name;”来检查触发器定义上的错误http://www.techonthenet.com/oracle/错误/ora04098.php (2认同)

小智 5

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

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

句法

ALTER TRIGGER trigger_Name DISABLE;

ALTER TRIGGER trigger_Name ENABLE;
Run Code Online (Sandbox Code Playgroud)