Son procedimientos que se ejecutan automticamente cuando se cumple una condicin establecida. Los triggers pueden ser de: Insercin (INSERT) Actualizacin (UPDATE) Eliminacin (DELETE).
NOTA: Para poder crear el Disparador hay que tener presente:
Deben existir las Tablas Asociadas a el Disparador El Disparador no debe tener un nombre asociado a una palabra reservada del sistema. Se debe previamente modificar el comodn de ejecucin de comandos que esta por defecto (;). para ello utilizamos DELIMITER @ OJO --> no es obligatorio - @ - puede ser cualquier comodn No se permite dentro de la Sentencia del trigger ejecutar un comando Select. No se admiten ms de un trigger que relacionen a una misma tabla con la misma accin. Hasta ahora versin del Ejemplo 5.5.24 ao 2013
DELIMITER @ CREATE trigger nombre_trigger [before, after] [insert, update, delete] ON tabla For Each Row Begin Sentencia a Ejecutar [insert, update, delete] End; @ DELIMITER ;
CREATE database IF NOT EXISTS bdTrigger; USE bdTrigger;
CREATE TABLE IF NOT EXISTS tb_cliente ( id_orden INT NOT NULL auto_increment, documento VARCHAR(12), nombre VARCHAR(25) NOT NULL, apellido VARCHAR(35)NOT NULL, telefono VARCHAR(15), email VARCHAR(50), PRIMARY KEY(id_orden,documento) )engine=InnoDB;
/* En esta tabla guardaremos el respaldo de los datos luego de ejecutar una instruccin en la tabla tb_cliente mediante el Disparador*/ CREATE TABLE IF NOT EXISTS tb_seguridad_cliente ( documento_c VARCHAR(12), nombre_c VARCHAR(25), apellido_c VARCHAR(35), telefono_c VARCHAR(15), email_c VARCHAR(50), fecha_accion_c DATE, accion_c VARCHAR(11) /* Agregado, Modificado, Cancelado-0-(Eliminado)*/ )engine=InnoDB;
NOTA: El comando new nos permite referenciar al valor que viene por primera vez, seguido por el nombre del campo que deseamos tomar de la tabla a la cual definimos en el disparador al momento de crearlo (tb_cliente)
Si lo que deseamos es INSERTAR (insert) solamente podemos utilizamos el comando new.
Si lo que deseamos es ACTUALIZAR (update) podremos utilizar los dos comandos permitidos new y old.
Si usamos -- old -- hacemos referencia al dato que contena el registro antes de modificarlo.
si lo que deseamos es ELIMINAR (delete) solamente podemos utilizar el comando old.
/* Trigger que se acciona luego de INSERTAR algn registro en la Tabla tb_cliente*/
DELIMITER @ CREATE TRIGGER tr_insert_cliente BEFORE INSERT ON tb_cliente FOR EACH ROW BEGIN INSERT INTO tb_seguridad_cliente VALUES ( new.documento, new.nombre, new.apellido, new.telefono, new.email, curdate(),'Agregado'); END; @ DELIMITER ;
/* Trigger que se acciona luego de ACTUALIZAR algn registro en la Tabla tb_cliente*/
DELIMITER @ CREATE TRIGGER tr_update_cliente BEFORE UPDATE ON tb_cliente FOR EACH ROW BEGIN INSERT INTO tb_seguridad_cliente VALUES (new.documento, new.nombre, new.apellido, new.telefono, new.email, curdate(), 'Modificado'); END; @ DELIMITER ;
/* Trigger que se acciona luego de ELIMINAR algn registro en la Tabla tb_cliente*/
DELIMITER @ CREATE TRIGGER tr_delete_cliente BEFORE DELETE ON tb_cliente FOR EACH ROW BEGIN INSERT INTO tb_seguridad_cliente VALUES(old.documento, old.nombre, old.apellido, old.telefono, old.email, curdate(),'Eliminado'); END; @ DELIMITER ;
/* Insertamos clientes para verificar que el Disparador -- tr_insert_cliente -- Funcione correctamente */
/* Modificamos clientes para verificar que el Dispardor -- tr_update_cliente -- Funcione correctamente */
UPDATE tb_cliente SET documento='i065 -mod', nombre='nombre j22 mod', apellido='apellido mod', telefono='tel mod' WHERE id_orden = 7;
/* Eliminamos clientes para verificar que el Dispardor -- tr_delete_cliente -- Funcione correctamente */
DELETE FROM tb_cliente WHERE id_orden = 9;
/* Ahora si consultamos la tabla de tb_seguridad_cliente podremos observar que automticamente se han guardado los datos, sin necesidad de hacerlo mediante cdigo otra vez */
SELECT DISTINCT(documento_c), nombre_c, apellido_c, accion_c FROM tb_seguridad_cliente;
/* Para MOSTRAR los Disparadores - triggers empleamos el comando: Show triggers; */
Show triggers;
/* Para BORRAR los Disparadores - triggers empleamos el comando: Drop trigger nombre_trigger; */