MySQL. Automatización de tareas: eventos y triggers.

Activar el planificador de eventos.

Es un servicio o daemon que busca constantemente eventos a ejecutar.

Es necesario tanto para poder ejecutar tanto Eventos como Triggers.

Para saber si está activo debemos ejecutar:

SHOW PROCESSLIST;

Si aparece event_scheduler en la salida quiere decir que está activo.

También podemos podemos saber si está activo viendo el estado de la variable GLOBAL event_schedule:

SELECT @@GLOBAL.event_scheduler

Para activar/desactivar el planificador se utiliza:

SET GLOBAL event_scheduler=ON;
SET GLOBAL event_scheduler=OFF;

Más información en la documentación:

https://dev.mysql.com/doc/refman/5.7/en/events-configuration.html

Eventos

Un evento es una tarea que se ejecuta de forma automática en un momento previamente programado. Tanto de forma periódica como en un momento en concreto.

El evento únicamente puede realizar las accione dentro de los permisos que tiene el usuario que creo lo creo.

No se puede hacer referencia a una función almacenada por el usuario desde un evento.

Sintaxis

CREATE EVENT nombre_evento
ON SCHEDULE cuando_se_ejecutará [AT ... / EVERY ...][STARTS ...][ENDS ...]
[+ INTERVAL intervalo_de_ejecución]
DO accciones

Podemos ver los eventos del sistema con:

SHOW EVENTS;

Eliminar un evento:

DROP EVENT nombre_evento;
DROP EVENT IF EXISTS nombre_evento;

Ejecución de una sola vez

Se utiliza la condición AT

Ejemplo, el 1 de mayo se aumentar las existencias en 50 de todos los productos.

CREATE EVENT aumentar_existencias
ON SCHEDULE AT '2020-05-01'
DO
    UPDATE Productos
    SET Existencias = Existencias +50;

Ejecución recurrente

Se utiliza la condición EVERY

Ejemplo, lo mismo que el caso anterior, pero se ejecutará cada mes tras la primera ejecución.

CREATE EVENT aumentar_existencias
ON SCHEDULE EVERY 1 MONTH STARTS '2020-05-01'
DO
    UPDATE Productos
    SET Existencias = Existencias +50;

INTERVAL

Permite definir un período de tiempo.

Ejemplo, se aumentará el precio del queso cada día, empezando a partir de ahora y acabará dentro de tres días (fecha y hora actual + intervalo de 3 días)

CURRENT_TIMESTAMP + INTERVAL 3 DAY

CREATE EVENT aumentar_precio_queso
    ON SCHEDULE EVERY 1 DAY
    STARTS CURRENT_TIMESTAMP
    ENDS CURRENT_TIMESTAMP + INTERVAL 3 DAY
    DO
        UPDATE Productos
        SET Precio=Precio+1
        WHERE NomProducto='Queso Cabrales';

ON COMPLETION

Por defecto el evento se elimina tras su ejecución. Con ON COMPLETION podemos guardar el evento para reutilizarlo.

CREATE EVENT aumentar_existencias
ON SCHEDULE AT '2020-05-01'
ON COMPLETION PRESERVE
DO
    UPDATE Productos
    SET Existencias = Existencias +50;

Triggers

Un disparador/trigger es un código SQL que se ejecuta cuando se produce una determinada acción sobre la base de datos: INSERT, UPDATE o DELETE.

Sintaxis

CREATE TRIGGER nombre_trigger {BEFORE|AFTER} {UPDATE|INSERT|DELETE}
ON nombre_tabla
FOR EACH ROW
<bloque_de_instrucciones>

Existe una nomenclatura muy práctica para nombrar un trigger: nombre de la tabla, inicial de la operación DML y inicial del momento de la ejecución (AFTER o BEFORE).

Ejemplo: clientes_BI_TRIGGER (tabla clientes, before, insert)

Identificadores NEW y OLD

Para hacer referencia a la columna de una tabla la cual va sufrir una modificación deberemos utilizar OLD o NEW dependiendo de si queremos acceder al viejo o al nuevo valor.

Si usamos UPDATE podremos referirnos a un valor como OLD y NEW.

Si usamos INSERT solo existirá NEW

Y si usamos DELETE solo existirán valores como OLD

Ejemplo:

DELIMITER //
CREATE TRIGGER cuenta_BU_Trigger BEFORE UPDATE ON cuenta
FOR EACH ROW
BEGIN
    IF NEW.saldo < 0 THEN
        SET NEW.saldo = 0;
    ELSEIF NEW.saldo > 100 THEN
        SET NEW.saldo = 100;
    END IF;
END

Deja una respuesta