Está en la página 1de 8

TRIGGER O DISPARADORES EN MYSQL.

Un trigger o disparador es un objeto de base de datos que se asocia a una tabla y se activa cuando se produce algn evento sobre dicha tabla. Supongamos que tenemos una tabla, llamada empleados, formada por varios campos, y queremos registrar en otra tabla, llamada auditora, las modificaciones que se produzcan sobre la tabla empleados. Por ejemplo, podramos registrar en la tabla auditora la fecha y hora en la que se realiza algn cambio en la tabla empleados, adems del valor modificado. Todo esto es posible gracias a los triggers, que como he dicho antes, se activan cuando se produce algn evento sobre alguna tabla.
Cmo crear un trigger en MySQL?

La sintaxis bsica para crear un trigger en MySQL es la siguiente: CREATE TRIGGER nombre_trigger {BEFORE|AFTER} {INSERT|UPDATE|DELETE} ON nombre_tabla FOR EACH ROW BEGIN sentencias_sql; END;

BEFORE|AFTER espefican cuando se dispara el trigger (antes de ejecutar la sentencia o despes) INSERT|UPDATE|DELETE especifican el evento que disparar el trigger ON nombre_tabla indica la tabla sobre la que acta el trigger sentencias_sql son las sentencias que se ejecutarn cuando se active el trigger

Veamos un ejemplo. Vamos a construir un trigger que se activar cada vez que insertemos un registro en una tabla llamada empleados. Lo que har el trigger ser insertar en una tabla, llamada AUDITORIA, la fecha y hora en la que se ha realizado la insercin del registro en la tabla empleados. As pues, nuestro primer paso ser crear la tabla AUDITORIA de la siguiente forma:

CREATE TABLE auditoria( fecha DATE, hora TIME);

Esta tabla estar formada por dos campos que llamaremos fecha y hora. A continuacin creamos la tabla empleados, formada por los campos emp_no, apellidos y salario. CREATE TABLE empleados( emp_no integer PRIMARY KEY, apellidos VARCHAR(50), salario INTEGER); Y acto seguido crearemos el trigger, que llamaremos trigger1, de la siguiente forma:

DELIMITER | CREATE TRIGGER trigger1 BEFORE INSERT ON empleados FOR EACH ROW BEGIN INSERT INTO auditoria VALUES(CURDATE(),CURTIME()); END; | DELIMITER ; La palabra DELIMITER se utiliza para indicar cul ser el carcter utilizado para delimitar la ltima lnea del trigger. En este caso se utiliza el carcter barra (|) justo antes de la sentencia de creacin del trigger (CREATE TRIGGER .) y al final de la ltima lnea de cdigo del trigger. Cuando creamos el trigger, escribimos de nuevo DELIMITER seguido de un punto y coma para indicar que el final de la orden SQL ser el punto y coma a partir de ahora. CURDATE() y CURTIME() son dos funciones internas de MySQL que devuelven la fecha y la hora actual. As pues, lo que har el trigger ser insertar la fecha y hora actual, en la tabla auditora, cada vez que se inserte un registro en la tabla empleados.

Para probar el trigger introduciremos un registro en la tabla empleados.

INSERT INTO EMPLE VALUES(1,Serrano Prez,1500);

Y a continuacin consultaremos la tabla auditora para observar que efectivamente queda registrada la fecha y hora.

Aplicacin Sentencias OLD y NEW


CREATE TABLE test1(a1 INT); CREATE TABLE test2(a2 INT); CREATE TABLE test3(a3 INT NOT NULL AUTO_INCREMENT PRIMARY KEY); CREATE TABLE test4( a4 INT NOT NULL AUTO_INCREMENT PRIMARY KEY, b4 INT DEFAULT 0 ); DELIMITER | CREATE TRIGGER testref BEFORE INSERT ON test1 FOR EACH ROW BEGIN INSERT INTO test2 SET a2 = NEW.a1; DELETE FROM test3 WHERE a3 = NEW.a1; UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1; END | DELIMITER ; INSERT INTO test3 (a3) VALUES (NULL), (NULL), (NULL), (NULL), (NULL), (NULL), (NULL), (NULL), (NULL), (NULL); INSERT INTO test4 (a4) VALUES (0), (0), (0), (0), (0), (0), (0), (0), (0), (0);

Si en la tabla test1 se insertan los siguientes valores: mysql> INSERT INTO test1 VALUES -> (1), (3), (1), (7), (1), (8), (4), (4); Query OK, 8 rows affected (0.01 sec) Records: 8 Duplicates: 0 Warnings: 0 Entonces los datos en las 4 tablas quedarn as: mysql> SELECT * FROM test1; +------+ | a1 | +------+ | 1| | 3| | 1| | 7| | 1| | 8| | 4| | 4| +------+ 8 rows in set (0.00 sec) mysql> SELECT * FROM test2; +------+ | a2 | +------+ | 1| | 3| | 1| | 7| | 1| | 8| | 4| | 4| +------+ 8 rows in set (0.00 sec) mysql> SELECT * FROM test3; +----+ | a3 | +----+ | 2| | 5| | 6| | 9|

| 10 | +----+ 5 rows in set (0.00 sec) mysql> SELECT * FROM test4; +----+------+ | a4 | b4 | +----+------+ | 1| 3| | 2| 0| | 3| 1| | 4| 2| | 5| 0| | 6| 0| | 7| 1| | 8| 1| | 9| 0| | 10 | 0 | +----+------+ 10 rows in set (0.00 sec) Las columnas de la tabla asociada con el disparador pueden referenciarse empleando los alias OLD y NEW. OLD.nombre_col hace referencia a una columna de una fila existente, antes de ser actualizada o borrada. NEW.nombre_col hace referencia a una columna en una nueva fila a punto de ser insertada, o en una fila existente luego de que fue actualizada. El uso de SET NEW.nombre_col = valor necesita que se tenga el privilegio UPDATE sobre la columna. El uso de SET nombre_var = NEW.nombre_col necesita el privilegio SELECT sobre la columna. Nota: Actualmente, los disparadores no son activados por acciones llevadas a cabo en cascada por las restricciones de claves extranjeras. Esta limitacin se subsanar tan pronto como sea posible.