2014-03-26 188 views
12

我正試圖在Oracle 10g數據庫中創建一個簡單的觸發器。這個創建觸發器的腳本運行乾淨。Oracle觸發器ORA-04098:觸發器無效且失敗的重新驗證

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行受影響)

我不明白nd什麼導致這個錯誤。你知道是什麼原因導致這個錯誤?或者爲什麼發生這種情況?

預先感謝您!

-David

+0

此外,我已經運行'INSERT INTO用戶(用戶ID,名字,姓氏,密碼)VALUES('如何','IM','測試','這個觸發器')',它工作正常。 – user3412162

+0

「用戶」和「警報」表的表結構是什麼? – 2014-03-26 17:26:47

回答

25

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 ......但是大概你會用觸發器做一些更有趣的事情。

+6

非常感謝!作爲一名Java開發人員,我特別尷尬的是,我的錯誤是一個缺少分號。哈哈 – user3412162

+1

我不知道關於觸發器錯誤的select子句,+1,也可以在觸發器的定義上運行'SHOW ERRORS TRIGGER trigger_name;'來檢查錯誤。http://www.techonthenet.com/ ORACLE /錯誤/ ora04098。PHP – maxivis

2

原因:嘗試檢索觸發器以執行並被發現無效。這也意味着編譯/授權失敗的觸發器。

操作:選項用於解決編譯/授權錯誤,禁用觸發器或放棄觸發器。

語法

ALTER TRIGGER trigger Name DISABLE; 

ALTER TRIGGER trigger_Name ENABLE; 
0
在我的情況

,引發此錯誤是由於程序不被創建..

CREATE SEQUENCE J.SOME_SEQ MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER NOCYCLE ;