¿Qué está mal con este Disparador PL/SQL?
Tengo esta tabla y quiero crear un desencadenador en Magazine
, que verifique “después de insertar” si el nombre del Magazine
insertado es tanto Vogue
como People
.
Si no es ninguno de ellos, se eliminará.
Tabla:
- MAGAZINE (ISBN, MAGNOM, PRIXMois);
Mi desencadenador:
CREATE OR REPLACE TRIGGER TMag
AFTER INSERT ON Magazine
FOR EACH ROW
DECLARE
e EXCEPTION;
BEGIN
IF :new.mag_nom != 'Vogue' or :new.mag_nom != 'People' THEN
DELETE Magazine WHERE ISBN = :new.ISBN;
RAISE e;
END IF;
EXCEPTION
WHEN e THEN
DBMS_OUTPUT.PUT_LINE('nom mag incorrecte');
END;
Pero el problema es que mi profesor me dijo:
Esto no es adecuado para todas las situaciones
No sé qué significa eso, ¿puedes ayudarme a mejorar este desencadenador?
Me pareció correcto, ¿qué hice mal?
davy.ai
Hay algunas mejoras que se pueden hacer al disparador:
IF-THEN-ELSE
en lugar de la estructuraIF-THEN
: Actualmente, el disparador verifica si el nombre de la revista no es igual a Vogue O no es igual a People. Esto significa que el disparador siempre evaluará como verdadero y, por lo tanto, eliminará la fila. En su lugar, utiliza una estructuraIF-THEN-ELSE
para eliminar la fila solo si el nombre de la revista no es Vogue o People.Utiliza un mecanismo de manejo de excepciones mejor: Actualmente, el disparador genera una excepción y muestra un mensaje utilizando
DBMS_OUTPUT
. Esta no es una buena práctica en sistemas de producción, donde la excepción debe registrarse y manejarse de manera adecuada.Aquí tienes un disparador actualizado que implementa estos cambios:
Este disparador almacena el nombre de la revista en una variable local para una mejor legibilidad, utiliza una estructura
IF-THEN-ELSE
para eliminar la fila solo si el nombre de la revista no es Vogue o People, y registra cualquier excepción que ocurra durante la ejecución del disparador.