dissabte, 1 de gener del 2000

Disparadors (triggers)

CONCEPTES BÀSICS
Un disparador és un objecte que s'asocia a una taula i s'activa quan succeeix alguna acció contra aquesta taula.

Exemple d'utilització
Un disparador està programat per disparar-se quan insertem una nota nova, diferent del rang (0-10). Al intentar insertar la nota 11, NO ens permetrà fer-ho.

Cada SGBD implementa els seus disparadors, en el cas de mysql tenim algunes restriccions:
  • El nom del disparador és ÚNIC per a tot el sistema, no podem utilitzar un nom igual contra diferents taules.
  • El disparador NO pot cridar a un procediment emmagatzemat (utilitzant la sentència CALL).
  • No poden existir dos disparadors que s'executin contra una mateixa taula en el mateix moment, (però si en diferents moments).
En els disparadors, el moment en el que s'han d'executar, és molt important. Els disparadors s'executen ABANS (before) de fer l'acció o DESPRES (after) de fer l'acció.

EXEMPLE TRIGGER
El disparador s'encarrega d'acumular les ventes realitzades al llarg del dia. Esta associat a la taula 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 nom del trigger sera disp1, s'activarà abans de fer l'acció i el que fará es sumar cada venta a una variable global anomenada sum.

SENTÈNCIES

Hem vist en l'exemple anterior, que les columnes de la taula que estan associades al disparador, es poden referencia utilitzant els alias OLD i NEW.
OLD.nom_columna fa referència a una columna d'una fila existent, abans de ser actualitzada o esborrada.
NEW.nom_columna fa referència a una columna en una nova fila a punt de ser insertada, o en una fila existent desprès de ser actualitzada.

Eliminar un disparador

Per esborrar un disparador, és necessari el privilegi super 
DROP TRIGGER nombre_disp

Gestió dels errors

Durant l'execució dels disparadors, MySQL gestiona els errors de la següent manera:
  • Si falla un disparador BEFORE, no s'executa l'operació.
  • Un disparador AFTER s'executa solament el disparador BEFORE (en cas d’existir) i l’operació s’executa exitosament.
  • Un error durant l’execució d’un disparador deriva en l’error de la sentencia que el va provocar.
  • En taules transaccionals, l’error d’un disparador tindria que provocar la cancel·lació (rollback) de tots els canvis realitzats. En taules no transaccionals, qualsevol canvi realitzat abans de l’error no es tindria que veure afectat. (Una taula transaccional sería per exemple el procès de retirar diners dels caixers dels bancs)

Cap comentari :

Publica un comentari a l'entrada