J'essaie de créer un déclencheur simple dans une base de données Oracle 10g. Ce script pour créer le déclencheur s'exécute en mode minimal.
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;
/
Mais quand je cours:
INSERT INTO Alerts(observationID, dateSent, message, dateViewed) VALUES (3, CURRENT_TIMESTAMP, 'Alert: You have exceeded the Max Threshold', NULL);
pour activer le déclencheur, je reçois ce message d'erreur:
ORA-04098: le déclencheur 'JMD.NEWALERT' est invalide et la validation a échoué (0 lignes affectées)
Je ne comprends pas ce qui cause cette erreur. Savez-vous ce qui cause cette erreur? Ou pourquoi cela se passe?
Merci d'avance!
-David
Oracle essaiera de recompiler les objets non valides comme ils sont mentionnés. Dans ce cas, le déclencheur n'est pas valide et chaque fois que vous essayez d'insérer une ligne, il essaie de recompiler le déclencheur et échoue, ce qui entraîne l'erreur ORA-04098.
Vous pouvez select * from user_errors where type = 'TRIGGER' and name = 'NEWALERT'
Pour voir quelle (s) erreur (s) le déclencheur obtient réellement et pourquoi il ne compile pas. Dans ce cas, il semble qu'il vous manque un point-virgule à la fin de la ligne insert
:
INSERT INTO Users (userID, firstName, lastName, password)
VALUES ('how', 'im', 'testing', 'this trigger')
Alors fais-le:
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;
/
Si vous recevez un avertissement lors de la compilation, vous pouvez utiliser show errors
Si vous utilisez SQL * Plus ou SQL Developer, ou interrogez à nouveau user_errors
.
Bien sûr, cela suppose que vos tables Users
aient ces noms de colonne et qu'elles sont toutes varchar2
... mais vous ferez probablement quelque chose de plus intéressant avec le déclencheur.
Cause: Un trigger a été tenté d'être récupéré pour exécution et s'est avéré invalide. Cela signifie également que la compilation/autorisation a échoué pour le déclencheur.
Action: Les options consistent à résoudre les erreurs de compilation/autorisation, à désactiver le déclencheur ou à le supprimer.
Syntaxe
ALTER TRIGGER trigger Name DISABLE;
ALTER TRIGGER trigger_Name ENABLE;
dans mon cas, cette erreur est générée car la séquence n'a pas été créée.
CREATE SEQUENCE J.SOME_SEQ MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER NOCYCLE ;