当前位置: 首页 > 面试题库 >

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

狄凯
2023-03-14
问题内容

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

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

先感谢您!

-大卫


问题答案:

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



 类似资料:
  • 触发器的定义就是说某个条件成立的时候,触发器里面所定义的语句就会被自动的执行。 因此触发器不需要人为的去调用,也不能调用。触发器的触发条件其实在定义的时候就已经设定好了。这里面需要说明一下,触发器可以分为语句级触发器和行级触发器。 触发器的基础知识和示例: Oracle之前插入触发器 - https://www.xnip.cn/oracle/before_insert.html Oracle之后插

  • 问题内容: 在oracle中,我可以指定列,这将引发触发器的触发: 现在,我想执行以下操作:当 只 更新 一 列时,我不希望触发触发器。这怎么可能? 我可以列出除那一列之外的所有列,该列不应引起触发器的触发。对于具有许多列的表而言,这非常麻烦。 另一种方法是使用像这样的UPDATING函数: 但是,如果我立即更改了COL1 和 COL3,则该语句的计算结果为false。那不是我想要的,因为我只想更

  • 本文向大家介绍MySQL触发器 Update触发Insert失败,包括了MySQL触发器 Update触发Insert失败的使用技巧和注意事项,需要的朋友参考一下 今天工作需要,想要实现将仅对状态更新的表进行历史记录显示,于是考虑在原表中建立触发器,将更新的内容同时写入另一张表 于是进行测试 执行触发器语句,报错,报错内容如下: 分析,由于访问工具HediSQL,导致无法正常创建触发器,相同语句,

  • 问题内容: 我有一个表,该表的索引自动由使用序列的触发器填充(Oracle数据库) 我有一个匹配的Java类: 当我尝试持久保存A的实例时,如下所示: 我得到这个问题: 保存调用返回的代码中的ID = “ X” 数据库中的ID = “ X + 1” 有没有一种方法可以设置Hibernate来让数据库触发器创建ID? 谢谢 问题答案: HIbernate问题上发现的与Oracle触发器有关的响应,用

  • 本文向大家介绍Oracle触发器trigger详解,包括了Oracle触发器trigger详解的使用技巧和注意事项,需要的朋友参考一下 触发器相关概念及语法 概述 本篇博文中主要探讨以下内容: 什么是触发器 触发器的应用场景 触发器的语法 触发器的类型 案例 数据: 触发器的概念和第一个触发器 数据库触发器是一个与表相关联的,存储的PL/SQL 语句。 每当一个特定的数据操作语句(insert u

  • 问题内容: 我有一个触发器,我正尝试使用它来更新它侦听的同一张表。 但是,提交创建或更新后,出现以下错误: 感谢您的帮助! 问题答案: 您正在更新触发器已写入的同一表。您需要这样的东西: