一尘不染

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

sql

我正在尝试在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行)

我不知道是什么导致此错误。您知道导致此错误的原因吗?还是为什么会这样?

先感谢您!

-大卫


阅读 705

收藏
2021-03-10

共1个答案

一尘不染

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…但是,大概您将对触发器做一些更有趣的事情。

2021-03-10