CONCEPTOS BÁSICOS

Un disparador es un objeto que se asocia a una tabla y se activa cuando sucede alguna acción contra esta tabla.

Explicación de uso

Un disparador está programado para dispararse cuando insertamos una nota nueva, diferente del rango (0-10). Al intentar insertar la nota 11, NO nos permitirá hacerlo.

Cada SGBD implementa sus disparadores, en el caso de mysql tenemos algunas restricciones:

  • El nombre del disparador es ÚNICO para todo el sistema, no podemos utilizar un nombre igual contra diferentes tablas.
  • El disparador NO puede llamar a un procedimiento almacenado (utilizando la sentencia CALL).
  • No pueden existir dos disparadores que se ejecuten contra una misma tabla en el mismo momento (pero sí en diferentes momentos).

En los disparadores, el momento en el que se tienen que ejecutar es muy importante. Los disparadores se ejecutan ANTES (before) de hacer la acción o DESPUÉS (after) de hacer la acción.

EJEMPLO TRIGGER

El disparador se encarga de acumular las ventas realizadas a lo largo del día. Está asociado a la tabla comptes (num, quantitat).

mysql> CREATE TRIGGER disp1 BEFORE INSERT ON comptes FOR EACH ROW SET @sum=@sum+NEW.quantitat;

INSERT INTO comptes VALUES (1,100),(2,50);

El nombre del trigger será disp1, se activará antes de hacer la acción y lo que hará es sumar cada venta a una variable global llamada sum.

SENTENCIAS

Hemos visto en el ejemplo anterior que las columnas de la tabla que están asociadas al disparador se pueden referenciar utilizando los alias OLD y NEW. OLD.nom_columna hace referencia a una columna de una fila existente, antes de ser actualizada o borrada. NEW.nom_columna hace referencia a una columna en una nueva fila a punto de ser insertada, o en una fila existente después de ser actualizada.

Eliminar un disparador

Para borrar un disparador, es necesario el privilegio super

DROP TRIGGER nombre_disp

Gestión de los errores

Durante la ejecución de los disparadores, MySQL gestiona los errores de la siguiente manera:

  • Si falla un disparador BEFORE, no se ejecuta la operación.
  • Un disparador AFTER se ejecuta solamente si el disparador BEFORE (en caso de existir) y la operación se ejecutan exitosamente.
  • Un error durante la ejecución de un disparador deriva en el error de la sentencia que lo provocó.
  • En tablas transaccionales, el error de un disparador tendría que provocar la cancelación (rollback) de todos los cambios realizados. En tablas no transaccionales, cualquier cambio realizado antes del error no se tendría que ver afectado. (Una tabla transaccional sería por ejemplo el proceso de retirar dinero de los cajeros de los bancos)