web-dev-qa-db-fra.com

Oracle Trigger ORA-04098: le déclencheur n'est pas valide et la re-validation a échoué

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

21
user3412162

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.

36
Alex Poole

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;
3
Kiran.Bakwad

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 ;
0
Siva Anand