加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2020-12-12 16:40:07 所属栏目:MsSql教程 来源:网络整理
导读:我试图在oracle 10g数据库中创建一个简单的触发器.此脚本创建触发器运行正常. CREATE OR REPLACE TRIGGER newAlertAFTER INSERT OR UPDATE ON Alerts BEGIN INSERT INTO Users (userID,firstName,lastName,password) VALUES ('how','im','testing','this trig
我试图在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 …但是可能你会真的做一些更有趣的触发器.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读