Estoy intentando crear un trigger simple en una base de datos 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 lo ejecuto:
INSERT INTO Alerts(observationID, dateSent, message, dateViewed) VALUES (3, CURRENT_TIMESTAMP, 'Alert: You have exceeded the Max Threshold', NULL);
para activar el disparador, me sale este mensaje de error:
ORA-04098: trigger 'JMD.NEWALERT' is invalid and failed re-validation (0 filas afectadas)
No entiendo cuál es la causa de este error. ¿Sabes qué causa este error? ¿O por qué ocurre?
Gracias de antemano.
-David
Oracle intentará recompilar los objetos inválidos a medida que se hace referencia a ellos. Aquí el trigger es inválido, y cada vez que intente insertar una fila intentará recompilar el trigger, y fallará, lo que lleva al error ORA-04098.
Puede select * from user_errors where type = 'TRIGGER' and name = 'NEWALERT'
para ver qué error(es) obtiene realmente el disparador y por qué no compila. En este caso parece que le falta un punto y coma al final de la línea insert
:
INSERT INTO Users (userID, firstName, lastName, password)
VALUES ('how', 'im', 'testing', 'this trigger')
Pues 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 recibes una advertencia de compilación cuando haces eso puedes hacer show errors
si estás en SQL*Plus o SQL Developer, o consultar user_errors
de nuevo.
Por supuesto, esto asume que tu tabla Users
tiene esos nombres de columna, y que son todos varchar2
... pero presumiblemente estarás haciendo algo más interesante con el trigger.
Causa: Se ha intentado recuperar un disparador para su ejecución y se ha encontrado que no es válido. Esto también significa que falló la compilación/autorización para el disparador.
Acción: Las opciones son resolver los errores de compilación/autorización, deshabilitar el disparador o eliminar el disparador.
Sintaxis
ALTER TRIGGER trigger Name DISABLE;
ALTER TRIGGER trigger_Name ENABLE;