2014-03-26 4 views
12

Ich versuche, einen einfachen Trigger in einer Oracle 10g-Datenbank zu erstellen. Dieses Skript zum Erstellen des Triggers wird sauber ausgeführt.Oracle-Trigger ORA-04098: Trigger ist ungültig und erneute Validierung fehlgeschlagen

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;   
/

Aber wenn ich laufen:

INSERT INTO Alerts(observationID, dateSent, message, dateViewed) VALUES (3, CURRENT_TIMESTAMP, 'Alert: You have exceeded the Max Threshold', NULL); 

den Auslöser zu aktivieren, erhalte ich diese Fehlermeldung:

ORA-04098: Trigger 'JMD.NEWALERT' ist ungültig und fehlgeschlagen Revalidierung (0 Zeilen betroffen)

Ich bin nicht unterbesetzt Und was verursacht diesen Fehler. Weißt du, was diesen Fehler verursacht? Oder warum das passiert?

Vielen Dank im Voraus!

-David

+0

Auch habe ich laufen 'INTO Benutzer INSERT (userID, Vorname, Nachname, Passwort) WERTE ('wie', 'im', 'testen', 'dieser Auslöser') 'und es funktioniert gut. – user3412162

+0

Wie ist Ihre Tabellenstruktur für "Benutzer" - und "Alerts" -Tabellen? –

Antwort

25

Oracle wird versuchen, ungültige Objekte neu zu kompilieren, wie sie genannt werden. Hier ist der Trigger ungültig, und jedes Mal, wenn Sie versuchen, eine Zeile einzufügen, wird versucht, den Trigger neu zu kompilieren und zu scheitern, was zum Fehler ORA-04098 führt.

Sie können select * from user_errors where type = 'TRIGGER' and name = 'NEWALERT' sehen, welche Fehler der Trigger tatsächlich bekommt und warum es nicht kompiliert wird. In diesem Fall scheint es Ihnen fehlt ein Semikolon am Ende der insert Linie:

INSERT INTO Users (userID, firstName, lastName, password) 
VALUES ('how', 'im', 'testing', 'this trigger') 

So machen:

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;   
/

Wenn Sie eine Zusammenstellung Warnung erhalten, wenn Sie das tun, was Sie tun können Wenn Sie in SQL * Plus oder SQL Developer sind oder erneut user_errors abfragen.

Natürlich geht das davon aus, dass Ihre Users Tabellen diese Spaltennamen haben, und sie sind alle varchar2 ... aber vermutlich werden Sie etwas interessanter mit dem Auslöser wirklich tun.

+6

Vielen Dank! Als Java-Entwickler ist mir besonders peinlich, dass mein Fehler ein fehlendes Semikolon war. Haha – user3412162

+1

Ich wusste nichts über die SELECT-Klausel für den Trigger-Fehler, +1 dafür, und Sie können auch ausführen SHOW ERRORS TRIGGER trigger_name; für Check-Fehler auf der Trigger-Definition http://www.techonthenet.com/ oracle/Fehler/ora04098.php – maxivis

2

Ursache: Es wurde versucht, einen Trigger zur Ausführung abzurufen, der als ungültig erkannt wurde. Dies bedeutet auch, dass die Kompilierung/Autorisierung für den Trigger fehlgeschlagen ist.

Aktion: Optionen dienen zum Auflösen der Kompilierungs-/Autorisierungsfehler, zum Deaktivieren des Triggers oder zum Ablegen des Triggers.

Syntax

ALTER TRIGGER trigger Name DISABLE; 

ALTER TRIGGER trigger_Name ENABLE; 
0

in meinem Fall, so wird dieser Fehler aufgrund Folge angehoben nicht erstellt wurde ..

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