Está en la página 1de 5

MySQL Triggers-Bitacora

https://www.hoclabs.com/2017/05/14/mysql-triggers/
https://www.hoclabs.com/blog/

May 14, 2017Hiram GuerreroMySQLNo Comments

Ahora toca publicar algo de MySQL, así que empezaremos con algo de
triggers! Si aún no los has utilizado sigue leyendo porque seguro que
aprendes algo nuevo y muy útil a la hora de trabajar con BD, en particular
con MySQL.

¿Trigger?

Un trigger (disparador) es una función que se ejecuta antes o después de


algún cambio (INSERT, UPDATE, DELETE) en una tabla.

Casos de uso

 Para validar la información antes de insertar los datos en una tabla


 Llevar una bitácora de cambios realizados
 Procesar y operar datos antes de registrar

Práctica

Realizaremos un ejercicio básico donde registraremos los


actualizaciones realizadas sobre una tabla de usuarios. Para ello
definiremos dos tablas, usuarios y bitacora, la primera sera nuestra tabla
principal donde almacenaremos la información de los usuarios, en la
segunda llevaremos un registro de todos los cambios realizados.

CREATE TABLE `usuarios` (


`id` int(11) NOT NULL AUTO_INCREMENT,
`email` varchar(255) DEFAULT NULL,
`password` varchar(255) DEFAULT NULL,
`nombre` varchar(255) DEFAULT NULL,
`telefono` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

CREATE TABLE `bitacora` (


`id_usuario` int(11) NOT NULL,
`email` varchar(255) DEFAULT NULL,
`password` varchar(255) DEFAULT NULL,
`nombre` varchar(255) DEFAULT NULL,
`telefono` varchar(255) DEFAULT NULL,
`fecha` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=latin1

A continuación tenemos el código de nuestro trigger, el cual


llamaremos after_usuarios_update:

CREATE TRIGGER after_usuarios_update


AFTER UPDATE ON usuarios
FOR EACH ROW
BEGIN
INSERT INTO bitacora
SET
id_usuario = OLD.id
nombre = OLD.nombre,
email = OLD.email,
password = OLD.password,
telefono = OLD.telefono;
END

Una vez ejecutado nuestro trigger, deben ingresar al menos un registro en


la tabla usuarios, después deben cambiar al menos un campo de dicho
registro, una vez realizado esto verán como la tabla bitacora empieza a
ser actualizada en automático con los antiguos valores del registro
actualizado.

Ahora que ya crearon y ejecutaron el trigger creado expliquemos como


se deben declarar:
 CREATE TRIGGER after_usuarios_update (definimos el nombre del trigger)
 AFTER UPDATE ON usuarios (momento en que el trigger es accionado: Después
de actualizar la tabla usuarios)
 FOR EACH ROW (para todas las filas donde hubo algún cambio)
 BEGIN (donde inicia el código sql de la acción a realizar)
 En nuestro caso tenemos un INSERT a la tabla bitacora donde definimos que
campos vamos a llenar, el prefijo OLD inidica lo que había en nuestra tabla de
usuarios en dicho campo
 END (donde acaba el código sql de la acción a realizar)
 

Para nuestro segundo ejemplo utilizaremos otra tabla bitácora donde


además de almacenar el valor de lo que había antes de actualizar nuestra
tabla de usuarios también almacenaremos los nuevos valores
ingresados. Para ello modificaremos la estructura de nuestra
tabla bitacora como sigue:

CREATE TABLE `bitacora` (


`id_usuario` int(11) NOT NULL,
`old_email` varchar(255) DEFAULT NULL,
`old_password` varchar(255) DEFAULT NULL,
`old_nombre` varchar(255) DEFAULT NULL,
`old_telefono` varchar(255) DEFAULT NULL,
`new_email` varchar(255) DEFAULT NULL,
`new_password` varchar(255) DEFAULT NULL,
`new_nombre` varchar(255) DEFAULT NULL,
`new_telefono` varchar(255) DEFAULT NULL,
`fecha` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=latin1

 Después modificaremos nuestro trigger para que sea capaz de


almacenar los nuevos y viejos valores:

CREATE TRIGGER after_usuarios_update


AFTER UPDATE ON usuarios
FOR EACH ROW
BEGIN
INSERT INTO bitacora
SET
id_usuario = OLD.id,
old_nombre = OLD.nombre,
old_email = OLD.email,
old_password = OLD.password,
old_telefono = OLD.telefono,
new_nombre = NEW.nombre,
new_email = NEW.email,
new_password = NEW.password,
new_telefono = NEW.telefono;
END

Una vez ejecutado el nuevo el trigger y haber realizado los cambios sobre
la bitacora pueden actualizar su tabla usuarios para observar los
cambios.

Si llegaste hasta acá quizá te preguntes sobre las palabras clave OLD y
NEW, o como puedes ver/actualizar/eliminar los triggers definidos en
nuestra BD.

De acuerdo con la doc oficial: Dentro del cuerpo de los triggers las
palabras clave OLD y NEW te permiten acceder a las columnas de las
filas afectadas por el mismo, estás son extensiones para los triggers de
MySQL y no hay diferencia entre usarlas como mayúsculas o minúsculas.

Instrucción para ver los triggers definidos: SHOW TRIGGERS;

Instrucción para mostrar la definición de un trigger: SHOW CREATE


TRIGGER after_usuarios_update;

Instrucción para eliminar un trigger: DROP  TRIGGER


after_usuarios_update;

Hasta aquí la primera parte de esta serie de triggers en MySQL, si tienes


alguna duda, consejo o aclaración por favor escribela en los
comentarios.
El repositorio con el código de todos los ejercicios del blog (incluído
este) lo puedes encontrar en el siguiente
repo: https://github.com/eichgi/blog-hoclabs

También podría gustarte