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

前端之家收集整理的这篇文章主要介绍了sql – 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: trigger ‘JMD.NEWALERT’ is invalid and Failed re-validation
(0 rows affected)

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

先谢谢你!

-大卫

解决方法

Oracle将尝试重新编译被引用的无效对象.这里的触发器无效,每次尝试插入一行时,它将尝试重新编译触发器,并且失败,这将导致ORA-04098错误.

您可以从user_errors中选择*,其中type =’TRIGGER’和name =’NEWALERT’来查看触发器实际获取错误以及为什么不能编译.在这种情况下,您似乎在插入行末尾缺少一个分号:

INSERT INTO Users (userID,password)
VALUES ('how','this trigger')

所以做:

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

如果您在执行此操作时收到编译警告,则可以在sql * Plus或sql Developer中显示错误,或再次查询user_errors.

当然,这假定你的用户表确实有这些列名称,而且都是varchar2 …但是可能你会真的做一些更有趣的触发器.

原文链接:https://www.f2er.com/mssql/81774.html

猜你在找的MsSQL相关文章