es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Hay algunas mejoras que se pueden hacer al disparador:

    1. Utiliza la estructura IF-THEN-ELSE en lugar de la estructura IF-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 estructura IF-THEN-ELSE para eliminar la fila solo si el nombre de la revista no es Vogue o People.
    2. 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:

    CREATE OR REPLACE TRIGGER TMag
      AFTER INSERT ON Magazine
      FOR EACH ROW
    DECLARE
      l_mag_nom VARCHAR2(100);
    BEGIN
      l_mag_nom := :new.mag_nom;
      IF l_mag_nom not in ('Vogue', 'People') THEN
         DELETE FROM Magazine WHERE ISBN = :new.ISBN;
      END IF;
    EXCEPTION
      WHEN OTHERS THEN
        -- Registra la excepción en lugar de generarla
        INSERT INTO log_table (message) VALUES ('Error en el disparador TMag: ' || SQLERRM);
    END;
    

    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.

Comments are closed.