此处将为大家介绍关于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 触发器无效且未通过重新验证)
- ORA-04098 触发器无效且未通过重新验证
- ORA-04098: 触发器 'PFA.TRIGG_MODIF_ADH' 无效且重新验证失败
- ORA-04098触发器 ''xxxx'' 无效且未通过重新验证问题
- Oracle 修改 新增 触发器 针对字段修改 触发器 误删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 触发器无效且未通过重新验证
触发器报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' 无效且重新验证失败
底层表发生了不好的问题。
例如:
创建表格:
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'' 无效且未通过重新验证问题
最近使用oracle数据库时,总是出现 ORA-04098触发器 ''xxxx'' 无效且未通过重新验证问题。我也不知道为什么会出现这个问题,但是找到了解决方法
解决方法:
1、使用sqlplus登陆数据库
2、执行alter trigger xxxxx disable
然后回到命令后之后执行修改或删除sql就正常了
Oracle 修改 新增 触发器 针对字段修改 触发器 误删Oracle表、数据、触发器找回 闪回查询
emmmm 写这个博客心情很复杂,,,本来这个触发器早就写好了,后来发生点事就写个博客当个备份吧,就当留纪念了;话不多数上问题以及SQL:
问题:
- 在ABONPB表上增加一个触发器,针对车牌号字段做update操作且new:传入的mduser字段为API,status为P时,向PA_BANK_REGNO_RECORD表中insert 一条记录,sync字段为0,修改次数为之前的次数加1,其余字段参考字段意义。(YC)
- 当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表、数据、触发器找回 闪回查询的相关知识,请在本站寻找。
本文标签: