Ich versuche, einen einfachen Auslöser in einer Oracle 10g-Datenbank zu erstellen. Dieses Skript zum Erstellen des Triggers wird fehlerfrei ausgeführt.
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 renne:
INSERT INTO Alerts(observationID, dateSent, message, dateViewed) VALUES (3, CURRENT_TIMESTAMP, 'Alert: You have exceeded the Max Threshold', NULL);
um den Trigger zu aktivieren, erhalte ich folgende Fehlermeldung:
ORA-04098: Auslöser 'JMD.NEWALERT' ist ungültig und die erneute Überprüfung ist fehlgeschlagen (0 Zeilen betroffen)
Ich verstehe nicht, was diesen Fehler verursacht. Wissen Sie, was diesen Fehler verursacht? Oder warum passiert das?
Danke im Voraus!
-David
Oracle versucht, ungültige Objekte neu zu kompilieren, wenn auf sie verwiesen wird. Hier ist der Trigger ungültig, und jedes Mal, wenn Sie versuchen, eine Zeile einzufügen, wird versucht, den Trigger neu zu kompilieren, und es tritt ein Fehler auf, der zum ORA-04098-Fehler 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 er nicht kompiliert. In diesem Fall scheint ein Semikolon am Ende der Zeile insert
zu fehlen:
INSERT INTO Users (userID, firstName, lastName, password)
VALUES ('how', 'im', 'testing', 'this trigger')
Also mach es:
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 Kompilierungswarnung erhalten, können Sie show errors
Ausführen, wenn Sie sich in SQL * Plus oder SQL Developer befinden, oder user_errors
Erneut abfragen.
Dies setzt natürlich voraus, dass Ihre Users
-Tabellen diese Spaltennamen haben und sie alle varchar2
Sind. Aber vermutlich werden Sie mit dem Auslöser wirklich etwas Interessanteres tun.
Ursache: Es wurde versucht, einen Auslöser zur Ausführung abzurufen, der als ungültig befunden wurde. Dies bedeutet auch, dass die Kompilierung/Autorisierung für den Trigger fehlgeschlagen ist.
Aktion: Sie können die Kompilierungs-/Autorisierungsfehler beheben, den Trigger deaktivieren oder den Trigger löschen.
Syntax
ALTER TRIGGER trigger Name DISABLE;
ALTER TRIGGER trigger_Name ENABLE;
in meinem Fall wird dieser Fehler ausgelöst, da die Sequenz nicht erstellt wurde.
CREATE SEQUENCE J.SOME_SEQ MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER NOCYCLE ;