Seas un dba o seas un programador (y yo en mi caso soy ambas cosas) la automatización de tareas es algo no sólo útil, sino a veces indispensable. Al estilo de los cron jobs de Linux MySQL nos ofrece la posibilidad de definir una acción o serie de acciones que se repita periódicamente o se ejecuten en un momento concreto.
Lo primero es habilitar a nuestro servidor MySQL para que pueda hacerlo, con la siguiente línea:
SET GLOBAL event_scheduler = ON;
Si usas PHPMyAdmin tienes por ahí un botón para activarlo, no necesitas comandos.
Bueno, la sintaxis básica de la creación de eventos, y a la guía de usuario de MySQL me remito, es la siguiente:
CREATE
[DEFINER = { user | CURRENT_USER }]
EVENT
[IF NOT EXISTS]
event_name
ON SCHEDULE schedule
[ON COMPLETION [NOT] PRESERVE]
[ENABLE | DISABLE | DISABLE ON SLAVE]
[COMMENT 'comment']
DO sql_statement;
schedule:
AT timestamp [+ INTERVAL interval] ...
| EVERY interval
[STARTS timestamp [+ INTERVAL interval] ...]
[ENDS timestamp [+ INTERVAL interval] ...]
interval:
quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}
Ok, visto así, acojona. Pero no todos los parámetros son obligatorios, y explicado es fácil. Reamente necesitas sólo un nombre para el event_name, una condición para que se cumpla el ON SCHEDULE y un código sql que ejecutar después del DO. Te meto un ejemplillo sacado del curro, por ejemplo:
CREATE EVENT `close_expired_campaigns`
ON SCHEDULE EVERY 1 DAY STARTS '2013-01-21 00:00:01'
ON COMPLETION NOT PRESERVE ENABLE
DO update tabla
set valido = 0
where
DATE_ADD(fechaCreacion, INTERVAL 45 DAY)<NOW() and valido=1;
Tiene algo más de código porque lo genera automáticamente PHPMyAdmin pero la idea es que crea un evento con ese nombre que, cada día un segundo después de medianoche actualice la tabla seleccionada poniendo a cero la columna indicada cuando se cumpla una condición (en este caso, que hayan pasado 45 días desde la creación). Bueno, como el código es tocho, os pongo debajo un ejemplo con la sintaxis más básica posible. Imaginemos una funcion que actualiza el saldo de una cuenta diaria de gastos a 1000 euros:
CREATE EVENT e_ActualizaSaldoDiario
ON SCHEDULE EVERY 1 DAY STARTS ‘2013-01-01 00:00:00’
DO UPDATE gastos SET saldo = 1000
Los dos ejemplos son recurrentes, se ejecutan todos los días a una hora (el parámetro Starts no permite definir el momento en que comenzará a ejecutarse, acuérdate de ponerlo porque si pones solo EVERY 1 DAY debería fallar, y no tiene por qué ser cada día, puedes poner un periodo concreto de horas, minutos, días, semanas…). Existe la posibilidad de que un evento se ejecute sólo una vez, en el momento que le indiques y luego se borre. Por ejemplo imaginemos que quieres que dentro de 6 horas se borren todos los registros del año 2012:
CREATE EVENT e_Borra2012
ON SCHEDULE AT now() + INTERVAL 6 HOUR
DO DELETE cuentas WHERE year = 2012
Y en estos tres ejemplos sólo hemos utilizado sentencias de SQL simples, pero imagina la potencia (y los riesgos de joderlo todo si la cagas, claro está) si los combinamos con procedimientos almacenados y con disparadores… Me imagino una bombillita alumbrando tu cabeza, y todas las cuestiones de mantenimiento y actualización que se te están ocurriendo.