triggers

Cómo automatizar acciones con los triggers en MySQL

|

Tiempo de lectura: 4 minutos

Actualizado el jueves, 21 diciembre, 2023

Con la ayuda de los triggers en MySQL podemos conseguir automatizar acciones sin necesidad de desarrollar lógica en otros lenguajes ¡Todo muy sencillo!

triggers

Un trigger o disparador es una regla que se asocia a una tabla. Mediante esta regla, se ejecutan una serie de instrucciones cuando se producen ciertos eventos sobre una tabla. Los eventos son: INSERT, UPDATE o DELETE.

Para poder realizar triggers es necesario que tengas permisos para ejecutar esas consultas. Además, es necesario tener una base de datos MySQL con una versión superior a la 5.0.2. Tranquilo, en dinahosting, ofrecemos versiones superiores a la 5.6. Recuerda que puedes ver las versiones de cada lenguaje en la tabla de nuestros hostings.

Las posibilidades de modificar información gracias a los triggers son infinitas. Gracias a ellos podrás mantener tu base de datos actualizada y al día, sin preocuparte por nada más. A continuación te explicaremos como se crean los triggers, cuáles son sus variables y algunos ejemplos sencillos. ¡Vamos allá!

Creación de triggers

Para poder realizar triggers y automatizar acciones, necesitamos una base de datos MySQL y una tabla sobre la que realizar consultas. Si ya poseemos esto, lo primero que necesitamos hacer es definirlo. Para ello escogemos un nombre para identificarlo, de manera que luego podamos borrar o buscar el trigger en nuestra base de datos. Antes de la instrucción CREATE es imprescindible declarar un delimitador.

DELIMITER $$
CREATE TRIGER nombre_trigger

El siguiente paso a realizar es definir cuando se va a ejecutar. Las posibilidades son AFTER o BEFORE (orden). Si sabes un poco de inglés ya te habrás dado cuenta de que AFTER indica que el trigger se ejecutará después de ejecutar la instrucción y BEFORE, antes. Recuerda que las órdenes que aceptan triggers son INSERT, DELETE y UPDATE.

DELIMITER $$
CREATE TRIGGER nombre_trigger
AFTER INSERT ON nombre_tabla

Ahora deberíamos indicar la estructura del trigger, es decir, en donde se van a aplicar los cambios que queramos, en nuestro caso lo vamos a hacer para todas las filas (FOR EACH ROW)

DELIMITER $$
CREATE TRIGGER nombre_trigger
AFTER INSERT ON nombre_tabla
FOR EACH ROW

Por último, introducimos entre BEGIN y END las líneas de código SQL que queremos ejecutar. También es necesario que cierres el delimitador definido al comienzo.

DELIMITER $$
CREATE TRIGGER nombre_trigger
AFTER INSERT ON nombre_tabla
FOR EACH ROW
BEGIN
//Instrucciones SQL
END;$$

Con este código, a partir de ahora, después de ejecutar un INSERT en nombre_tabla se ejecutarán las instrucciones declaradas dentro del BEGIN.

Recuerda que puedes eliminar un trigger haciendo uso de la sentencia DROP TRIGGER.

DROP TRIGGER nombre_trigger;

Instrucciones a emplear dentro de los triggers

Habitualmente lo que se introduce dentro de los disparadores son instrucciones condicionales, en otras palabras secuencias que se ejecutarán si se da un caso concreto, aunque no es obligatorio. Para poder manejar estas instrucciones condicionales tenemos las variables OLD y NEW.

Variable NEW

NEW almacena el valor que aporta la consulta a la base de datos. Con esta variable podemos acceder a los datos introducidos. Con NEW.nombre_columna se almacenará la información con el nuevo valor que tendrá ese registro modificado (desde un UPDATE o INSERT) en la tabla. Los trigger relacionados con DELETE no tendrán disponible la variable NEW.

Variable OLD

OLD a diferencia de NEW, almacena el valor de las columnas que van a ser borradas o eliminadas. Al igual que pasa con NEW, OLD no está disponible en todas las instrucciones, más concretamente el valor no se puede recuperar cuando la instrucción es un INSERT.

Ejemplos de triggers

Comprobación de datos

Imaginemos que tenemos una tabla clientes en la que almacenamos su edad. Para evitar problemas en el tratamiento de los datos, queremos evitar que se introduzcan edades negativas. Podríamos hacer algo parecido a:

DELIMITER $$

CREATE TRIGGER comprobar_edad
BEFORE INSERT ON cliente
FOR EACH ROW 
BEGIN
    IF NEW.edad<0
      THEN SET NEW.edad = 0;
    END IF; 
END; $$

Con este sencillo trigger evitaremos que en nuestra base de datos se puedan guardar edades menores a cero, de manera que podríamos omitir esta comprobación en desarrollos que hiciésemos con estos datos.

Realización de un histórico de productos

En este ejemplo no emplearemos una sentencia condicional. Imaginemos que tenemos una tienda online. Quizás nos interese tener una tabla en la que guardamos todos los productos que hemos tenido en nuestro catálogo en algún momento. Podríamos introducir los datos dentro del histórico siempre que introdujésemos un nuevo producto. Sin embargo, ¿No sería más sencillo automatizar un histórico de los productos? Gracias a los trigger podremos realizarlo sin tener que ejecutar dos instrucciones separadas.

DELIMITER $$
CREATE TRIGGER trigger_producto_historico 
AFTER INSERT ON producto
FOR EACH ROW
BEGIN 
   INSERT INTO producto_historico(id, descripcion, precio)
   VALUES (NEW.id, NEW.descripcion, NEW.precio, CURDATE());
END; $$

De esta forma, cada vez que incluyamos un producto nuevo, este también se añadirá a la tabla producto_historico, y aunque posteriormente borremos el artículo de la tabla producto, este seguirá existiendo en producto_historico.

A través de los ejemplos que hemos visto, hemos descubierto que gracias a los disparadores o triggers podemos automatizar acciones fácilmente con MySQL y mantener nuestra base de datos actualizada. Trabajar con bases de datos es una tarea delicada, por ello, si tienes dudas mejor que consultes con un experto. Si quieres más información sobre los Triggers y su funcionamiento, recuerda que tienes a mano la documentación de MySQL.

Si quieres probar esta y otras funcionalidades de las bases de datos, recuerda que todos nuestros planes de hosting (salvo Hosting correo) te dan acceso al menos a una base de datos.


Avatar de Edi Vieito

Comentarios

4 respuestas

    1. Avatar de Edi Vieito

      Gracias a ti por comentar. Te animamos a que sigas navegando por el blog 😉

  1. Avatar de Angel
    Angel

    Buena informacion, tengo una duda:
    en tu ejemplo de “Comprobación de datos” el trigger no deberia tener un BEFORE en lugar de un AFTER?

    1. Avatar de Edi Vieito

      Efectivamente. Sí, tienes razón. En este caso, sería más apropiado utilizar un trigger BEFORE en lugar de AFTER. Un trigger BEFORE se ejecuta antes de que se realice la operación de inserción, lo que permite realizar modificaciones en los datos antes de que sean almacenados en la base de datos. En cambio, un trigger AFTER se ejecuta después de que la operación ha sido completada.

      Lo cambios ahora mismo. Gracias por el apunte Ángel

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Newsletter

Suscríbete y recibe periódicamente consejos muy útiles para tu web y ecommerce 🙂 Además, te regalamos
3 guías
: Digitalización, WordPress y Ciberseguridad.

Conviértete en afiliado

Gana dinero recomendando dinahosting a todo el mundo.