trigger solucion ora invalid ggs_ddl_trigger_before failed and sql oracle oracle10g ora-04098

sql - solucion - Oracle Trigger ORA-04098: el desencadenante no es válido y falló la re-validación



ora 04098 trigger sys ggs_ddl_trigger_before is invalid and failed re validation (3)

Causa: se intentó recuperar un desencadenante para su ejecución y se encontró que no era válido. Esto también significa que la compilación / autorización falló para el disparador.

Acción: las opciones son resolver los errores de compilación / autorización, deshabilitar el desencadenante o soltar el desencadenante.

Sintaxis

ALTER TRIGGER trigger Name DISABLE; ALTER TRIGGER trigger_Name ENABLE;

Estoy tratando de crear un disparador simple en una base de datos de Oracle 10g. Este script para crear el disparador se ejecuta limpio.

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

Pero cuando corro:

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

para activar el disparador, recibo este mensaje de error:

ORA-04098: el desencadenante ''JMD.NEWALERT'' no es válido y falló la re-validación (0 filas afectadas)

No entiendo cuál es la causa de este error. ¿Sabes qué causa este error? ¿O por qué sucede esto?

¡Gracias de antemano!

-David


En mi caso, este error se produce debido a que la secuencia no fue creada.

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


Oracle intentará volver a compilar los objetos no válidos a los que se hace referencia. Aquí el desencadenante no es válido, y cada vez que intenta insertar una fila, intentará volver a compilar el desencadenante y fallará, lo que lleva al error ORA-04098.

Puede select * from user_errors where type = ''TRIGGER'' and name = ''NEWALERT'' para ver qué error (s) recibe realmente el activador y por qué no se compilará. En este caso, parece que le falta un punto y coma al final de la línea de insert :

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

Así que hazlo:

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 recibe una advertencia de compilación cuando lo hace, puede show errors si está en SQL * Plus o SQL Developer, o consultar user_errors nuevamente.

Por supuesto, esto supone que las tablas de Users tienen esos nombres de columna, y todos son varchar2 ... pero presumiblemente harás algo más interesante con el activador.