GVKun编程网logo

Oracle触发器ORA-04098:触发器无效且重新验证失败(oracle 触发器无效且未通过重新验证)

29

此处将为大家介绍关于Oracle触发器ORA-04098:触发器无效且重新验证失败的详细内容,并且为您解答有关oracle触发器无效且未通过重新验证的相关问题,此外,我们还将为您介绍关于ORA-040

此处将为大家介绍关于Oracle触发器ORA-04098:触发器无效且重新验证失败的详细内容,并且为您解答有关oracle 触发器无效且未通过重新验证的相关问题,此外,我们还将为您介绍关于ORA-04098 触发器无效且未通过重新验证、ORA-04098: 触发器 'PFA.TRIGG_MODIF_ADH' 无效且重新验证失败、ORA-04098触发器 ''xxxx'' 无效且未通过重新验证问题、Oracle 修改 新增 触发器 针对字段修改 触发器 误删Oracle表、数据、触发器找回 闪回查询的有用信息。

本文目录一览:

Oracle触发器ORA-04098:触发器无效且重新验证失败(oracle 触发器无效且未通过重新验证)

Oracle触发器ORA-04098:触发器无效且重新验证失败(oracle 触发器无效且未通过重新验证)

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

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

先感谢您!

-大卫

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

ORA-04098 触发器无效且未通过重新验证

ORA-04098 触发器无效且未通过重新验证

触发器报04098的错,首先确定该触发器是否没有正确授权

 select owner,object_name,object_type from dba_objects

从其中查出这个触发器到底是属于哪个用户的 然后

 ALTER TRIGGER MDSYS.SDO_TOPO_DROP_FTBL DISABLE 

如果还不行,可以看下触发器编码是否错误,定位到问题的地方,使用pl/sql   找到错误的存储过程或者触发器  ---右键有个(edit)编辑, 打开一个命令窗口,  然后执行一下(像设置的图标,在左上方),  就会定义到错误的地方。
 

ORA-04098: 触发器 'PFA.TRIGG_MODIF_ADH' 无效且重新验证失败

ORA-04098: 触发器 'PFA.TRIGG_MODIF_ADH' 无效且重新验证失败

底层表发生了不好的问题。

例如:

创建表格:

SQL> create table adherent(noadh number,nom number,prenom number,ncin number,dateadh number);

Table created.

创建触发器:

SQL> CREATE OR REPLACE trigger trigg_modifadh
  2  BEFORE UPDATE OF noAdh,nom,prenom,ncin,dateadh
  3   ON adherent
  4  FOR EACH ROW
  5  BEGIN
  6  RAISE_APPLICATION_ERROR(-20489,''  La modification sur ses coordonnées de adherent est  interdite !!! '');
  7  END;
  8  /

Trigger created.

删除一列:

SQL> alter table adherent drop column dateadh;

Table altered.

更新表将触发触发器:

SQL> update adherent set noadh = 1;
update adherent set noadh = 1
       *
ERROR at line 1:
ORA-04098: trigger ''SCOTT.TRIGG_MODIFADH'' is invalid and failed re-validation


SQL>

看到了吗?检查表。

ORA-04098触发器 ''xxxx'' 无效且未通过重新验证问题

ORA-04098触发器 ''xxxx'' 无效且未通过重新验证问题

最近使用oracle数据库时,总是出现 ORA-04098触发器 ''xxxx'' 无效且未通过重新验证问题。我也不知道为什么会出现这个问题,但是找到了解决方法

解决方法:

1、使用sqlplus登陆数据库

2、执行alter trigger xxxxx disable

然后回到命令后之后执行修改或删除sql就正常了

Oracle 修改 新增 触发器 针对字段修改 触发器 误删Oracle表、数据、触发器找回 闪回查询

Oracle 修改 新增 触发器 针对字段修改 触发器 误删Oracle表、数据、触发器找回 闪回查询

emmmm 写这个博客心情很复杂,,,本来这个触发器早就写好了,后来发生点事就写个博客当个备份吧,就当留纪念了;话不多数上问题以及SQL:

 

问题:

  

  1. 在ABONPB表上增加一个触发器,针对车牌号字段做update操作且new:传入的mduser字段为API,status为P时,向PA_BANK_REGNO_RECORD表中insert 一条记录,sync字段为0,修改次数为之前的次数加1,其余字段参考字段意义。(YC)
  2. 当insert进ABONPB时新案件时,同理lla_code为MA  为条件也要触发上班触发器,计数加一(后来添加)

 更新:提交一个闪回查询找误删数据的SQL,类似的网上还有很多就不一一举例了;;;;;

  闪回查询::

select * from dba_source a where a.type=''TRIGGER'';
SELECT * from dba_source a where a.name LIKE  ''%ABONPB_%'';



SELECT NAME, TEXT
      FROM DBA_SOURCE AS OF TIMESTAMP TO_TIMESTAMP(''2018-06-05 12:20:00'', ''yyyy-mm-dd hh24:mi:ss'')
      WHERE OWNER = ''ACSPRD''
      AND TYPE = ''PROCEDURE''
      AND NAME LIKE  ''%ABONPB_UPDATE%'';

 

 

触发器解决:

 

CREATE OR REPLACE TRIGGER ABONPB_UPDATE_20180615
  BEFORE UPDATE OR INSERT ON ABONPB_20180615
  FOR EACH ROW
DECLARE
  IXEST             INTEGER;
  CHAGE             INTEGER;
  IXEST2             INTEGER;
  CHAGE2             INTEGER;
BEGIN
  IF updating(''regnr'') AND :OLD.MDUSR = ''API'' AND :OLD.STATUS = ''P''AND :old.Regnr != :new.Regnr THEN
    SELECT COUNT(1) INTO IXEST FROM EMAPIII.PA_BANK_REGNO_RECORD T WHERE T.IDCARD_NO = :OLD.POLICYNR AND T.CARD_NO = :OLD.VIN AND  T.LASTNAME = :OLD.LASTNAME;
    IF IXEST = 0  THEN
      INSERT INTO EMAPIII.PA_BANK_REGNO_RECORD
        (ID,
         IDCARD_NO,
         CARD_NO,
         LASTNAME,
         REGNO,
         CHANGE_TIMES,
         CHANGE_TIME,
         CONTRACTCODE,
         SERIE,
         SYNC,
         ACCTNO)
      VALUES
        (EMAPIII.PA_BANK_REGNO_RECORD_SEQ.NEXTVAL,
         :NEW.VIN,
         :NEW.POLICYNR,
         :NEW.LASTNAME,
         :NEW.REGNR,
         0,
         SYSDATE,
         :NEW.LCO_LNA_CODE,
         :NEW.SERIE,
         0,
         :NEW.SUBNUMBER);

    ELSE
      SELECT T.CHANGE_TIMES INTO CHAGE FROM EMAPIII.PA_BANK_REGNO_RECORD T WHERE T.IDCARD_NO = :OLD.POLICYNR AND T.CARD_NO = :OLD.VIN  AND T.LASTNAME = :OLD.LASTNAME;

      UPDATE EMAPIII.PA_BANK_REGNO_RECORD
         SET REGNO =:new.Regnr, CHANGE_TIMES = CHAGE+1 , CHANGE_TIME = SYSDATE
       WHERE IDCARD_NO = :OLD.POLICYNR
         AND CARD_NO = :OLD.VIN
         AND LASTNAME = :OLD.LASTNAME;

    END IF;
    
  END IF;
  IF  :new.Lla_Code=''MA''THEN 
     SELECT COUNT(1) INTO IXEST2 FROM EMAPIII.PA_BANK_REGNO_RECORD T WHERE T.IDCARD_NO = :new.POLICYNR AND T.CARD_NO = :new.VIN AND  T.LASTNAME = :new.LASTNAME;
    IF IXEST2 = 0  THEN
      INSERT INTO EMAPIII.PA_BANK_REGNO_RECORD
        (ID,
         IDCARD_NO,
         CARD_NO,
         LASTNAME,
         REGNO,
         CHANGE_TIMES,
         CHANGE_TIME,
         CONTRACTCODE,
         SERIE,
         SYNC,
         ACCTNO)
      VALUES
        (EMAPIII.PA_BANK_REGNO_RECORD_SEQ.NEXTVAL,
         :NEW.VIN,
         :NEW.POLICYNR,
         :NEW.LASTNAME,
         :NEW.REGNR,
         0,
         SYSDATE,
         :NEW.LCO_LNA_CODE,
         :NEW.SERIE,
         0,
         :NEW.SUBNUMBER);

    ELSE
      SELECT T.CHANGE_TIMES INTO CHAGE2 FROM EMAPIII.PA_BANK_REGNO_RECORD T WHERE T.IDCARD_NO = :new.POLICYNR AND T.CARD_NO = :new.VIN  AND T.LASTNAME = :new.LASTNAME;

      UPDATE EMAPIII.PA_BANK_REGNO_RECORD
         SET REGNO =:new.Regnr, CHANGE_TIMES = CHAGE2+1 , CHANGE_TIME = SYSDATE
       WHERE IDCARD_NO = :new.POLICYNR
         AND CARD_NO = :new.VIN
         AND LASTNAME = :new.LASTNAME;

    END IF;
  
    END IF;
END;

 

ps:最后的最后一定要注意!!!!!!删除表时一定要备份该表的触发器、索引等,,,,,说多了都是泪啊!!!!!再然后,误删了没备份可以试试Oracle的闪回查询,运气好的话可以找回,,,

 

以上!!!

 

关于Oracle触发器ORA-04098:触发器无效且重新验证失败oracle 触发器无效且未通过重新验证的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于ORA-04098 触发器无效且未通过重新验证、ORA-04098: 触发器 'PFA.TRIGG_MODIF_ADH' 无效且重新验证失败、ORA-04098触发器 ''xxxx'' 无效且未通过重新验证问题、Oracle 修改 新增 触发器 针对字段修改 触发器 误删Oracle表、数据、触发器找回 闪回查询的相关知识,请在本站寻找。

本文标签: