Triggers en MySql














¿Qué son los triggers?

Los Triggers son objetos de una base de datos, pero no son globales (como si lo son los procedimientos y funciones). Estos objetos se vinculan a una tabla y se activan automáticamente al realizar un INSERT,UPDATE o DELETE sobre la tabla vinculada. 

NOTA: Los triggers solo se ejecutan cuando hay un INSERT,UPDATE o DELETE. Si colocas un SELECT, MySql se quejara.

IMPORTANTE: Dentro del trigger no podes hacer un INSERT, DELETE, UPDATE a un campo de la tabla con la que estas vinculando el trigger. Te daría el error 1442. Este error ocurre por que MySql no puede eliminar,insertar o actualizar un campo de una entidad que esta consultando, porque terminaría siendo una llamada recursiva.

Imagen 1 - Diagrama de funcionamiento de un trigger


Entonces tenemos una Tabla 1 al cual se vincula uno o varios triggers. Cuando ejecutamos una consulta INSERT, DELETE, UPDATE sobre Tabla 1 el trigger se desencadena modificando registros de las tablas Tabla 2 o Tabla N.

Sintaxis 

Imagen 2- Sintaxis

CREATE TRIGGER : Palabras claves que le dicen a MySql que vas a crear un trigger.

nombre_disp : Es el nombre del triggers. Se suele colocar la acción que va hacer el trigger

momento_disp : Aquí hay dos palabras para especificar el momento en el que el trigger se ejecutara.

BEFORE (antes) AFTER (después).

evento_disp : Aquí va ir una de las clausulas INSERT, UPDATE, DELETE.

nombre_tabla : El nombre de la tabla con el cual el triggers sera vinculado.

FOR EACH ROW : Significa que para cada registro INSERTADO, ELIMINADO O ACTUALIZADO se ejecutara un conjunto de sentencias.

sentencia_disp : Las sentencias que serán ejecutadas cuando al activarse el triggers.

Variables OLD y NEW

Hay dos variables (velas de esa forma) que se utilizan para acceder a los valores ya sean nuevos o viejos.

La regla para utilizar estas variables es la siguiente:

INSERT = NEW . No puedes acceder a un valor que no tenes, por eso se utiliza NEW.

DELETE = OLD. No podes eliminar un registro que no existe, por eso se utiliza OLD. OLD hace referencia a una fila existente en tu tabla.

UPDATE = NEW y OLD.


INSERT

INSERT INTO PRODUCTOS(CANT_PRODUCTOS) VALUES(45)

NEW.CANT_PRODUCTOS = 45 


DELETE

DELETE FROM PRODUCTOS WHERE ID = 45

OLD.ID = 45 (se asume que hay un registro en tu tabla con una id=45)


Ejemplo:

Con el fin de poner en practica lo que se explico anteriormente vamos a crear 2 tablas que tengan la misma cantidad de campos de manera que lo que hagamos en una se reflejara en la otra.

INSERT

Imagen 3 -Entidades para el ejemplo






Crearemos un trigger  para insertar datos. Los datos de la tabla productos2 tendran el nombre más la cadena "productos2"

Imagen 4- Trigger INSERTAR_PRODUCTO2





Insertamos el siguiente registro en la tabla productos:

INSERT INTO productos(NOMBRE,CANTIDAD_PRODUCTOS) VALUES("HARINA",150);

Resultado de la tabla productos

Imagen 5- Resultado productos


Imagen 6- Resultado de la tabla producto2


DELETE

Ahora creamos el trigger para eliminar los datos


Imagen 7- ELIMINAR_PRODUCTO2




El resultado que obtendrás es la eliminación de ambas filas en ambas tablas

UPDATE

Ahora crearemos un trigger que al momento de descontar cantidad de productos los registros se disminuyen en 1.

Las entidades quedaron de esta manera

Imagen 8- Estado de la tabla producto después de ejecutar el DELETE



Imagen 9- Estado de la tabla producto2 después de ejecutar el DELETE


















Creamos el siguiente trigger

Imagen 10- ACTULIZAR_PRODUCTO2












Al ejecutar la siguiente consulta:

SET @CANT_PRODUCTO = (SELECT productos.CANTIDAD_PRODUCTOS FROM productos WHERE productos.NOMBRE = "POLENTA");
UPDATE productos
SET productos.CANTIDAD_PRODUCTOS = @CANT_PRODUCTO - 1
WHERE productos.NOMBRE = "POLENTA"

Imagen 11- Resultado de la consulta UPDATE


Imagen 12- Resultado de la consulta UPDATE




































Nota: En dentro del trigger al actualizar coloco en el where old.CANTIDAD_PRODUCTOS. Esto va hacer igual a 50. Al ejecutarse el trigger POLENTA PRODUCTO2 es el único registro que coincide con la condición del where. En este caso lo hice de esta manera. Si existe otro producto con la misma cantidad de productos se decrementaria. 
Otro modo hubiera sido old.NOMBRE = CONCAT(old.NOMBRE," PRODUCTO2").

Conclusión

Los triggers, funciones, procedimientos junto con los eventos (tema para otro post) son un gran mecanismo de abstracción que nos ofrece el gestor MySql. Esto nos permite ejecutar menos consultas en el servidor (encargado de atender a los clientes), centralizar los posibles problemas de almacenamiento y un código más organizado en el servidor al no tener que mezclar el lenguaje del backen con el lenguaje SQL.


¡Saludos pro.grammersJr del mundo!

Comentarios