What is the difference between event and trigger in MySQL?

Crea Eventos Programados en MySQL Workbench

hace 3 años

Valoración: 4.22 (2609 votos)

En el mundo de la gestión de bases de datos, la automatización de tareas es crucial para mantener la eficiencia y el rendimiento. MySQL, uno de los sistemas de gestión de bases de datos más populares, ofrece una potente funcionalidad para la automatización a través de eventos programados. Estos eventos, similares a los cron jobs en sistemas operativos, permiten ejecutar tareas SQL de manera periódica o en momentos específicos, directamente desde el servidor de bases de datos. En este artículo, exploraremos en detalle cómo crear y gestionar eventos en MySQL utilizando MySQL Workbench, la herramienta gráfica oficial para MySQL.

How to create an event in MySQL Workbench?
Assuming you have MySQL rights to create events, the basic syntax is: CREATE EVENT `event_name` ON SCHEDULE schedule [ON COMPLETION [NOT] PRESERVE] [ENABLE | DISABLE | DISABLE ON SLAVE] DO BEGIN -- event body END; The schedule can be assigned various settings, e.g.
Índice de Contenido

¿Qué son los Eventos Programados en MySQL?

Los eventos programados en MySQL son objetos de bases de datos que contienen código SQL que se ejecuta según una programación predefinida. A diferencia de los triggers, que se activan en respuesta a cambios en los datos, los eventos se ejecutan en función del tiempo. Piensa en ellos como tareas programadas dentro de tu base de datos, ideales para realizar operaciones de mantenimiento, generar informes, o cualquier otra tarea repetitiva que necesites automatizar.

Algunos casos de uso comunes para los eventos programados incluyen:

  • Archivado de datos antiguos: Mover registros obsoletos a tablas de archivo para mantener las tablas principales más pequeñas y rápidas.
  • Generación de informes periódicos: Crear informes diarios, semanales o mensuales y almacenarlos o enviarlos por correo electrónico.
  • Limpieza de datos: Eliminar datos temporales o registros innecesarios de forma regular.
  • Optimización de tablas: Ejecutar tareas de mantenimiento como OPTIMIZE TABLE para mejorar el rendimiento.
  • Actualizaciones programadas: Realizar cambios en los datos en momentos específicos, como actualizar precios o estados al final del día.

Activando el Event Scheduler en MySQL

Antes de poder crear eventos programados, es fundamental asegurarse de que el Event Scheduler de MySQL esté activado. Este es un hilo especial que se encarga de ejecutar los eventos en el momento programado. Por defecto, el Event Scheduler suele estar desactivado. Para verificar su estado, puedes ejecutar el siguiente comando SQL:

SHOW PROCESSLIST;

Si el Event Scheduler está activo, verás al menos dos filas en la salida, y una de ellas tendrá el campo 'User' establecido como 'event_scheduler'. Si solo ves una fila, significa que el scheduler está inactivo.

Para activarlo, puedes utilizar el siguiente comando SQL:

SET GLOBAL event_scheduler = ON;

Este comando activa el Event Scheduler inmediatamente. Sin embargo, para que se mantenga activo después de reiniciar el servidor MySQL, debes configurarlo en el archivo de configuración de MySQL (my.cnf o my.ini). Abre el archivo de configuración y busca la sección [mysqld]. Añade o modifica la siguiente línea:

event_scheduler=ON

Guarda los cambios y reinicia el servidor MySQL. Ahora, el Event Scheduler se iniciará automáticamente al arrancar el servidor.

Creando un Evento en MySQL Workbench

MySQL Workbench proporciona una interfaz gráfica intuitiva para crear y gestionar eventos. Sigue estos pasos para crear tu primer evento:

  1. Conéctate a tu servidor MySQL utilizando MySQL Workbench.
  2. En el panel de Navigator, expande la conexión a tu servidor y luego expande la base de datos donde deseas crear el evento.
  3. Haz clic derecho en la carpeta Events y selecciona Create Event....
  4. Se abrirá una nueva pestaña en el editor SQL con el esqueleto para crear un evento.

El esqueleto de creación de un evento tiene la siguiente estructura básica:

CREATE EVENT `nombre_del_evento` ON SCHEDULE schedule [ON COMPLETION [NOT] PRESERVE] [ENABLE | DISABLE | DISABLE ON SLAVE] DO BEGIN -- Aquí va el código SQL del evento END

Vamos a desglosar cada parte de esta sintaxis:

  • CREATE EVENT `nombre_del_evento`: Define el nombre del evento. Elige un nombre descriptivo que indique la función del evento.
  • ON SCHEDULE schedule: Define la programación del evento. Aquí especificas cuándo y con qué frecuencia se ejecutará el evento. Las opciones de programación son variadas y muy flexibles.
  • [ON COMPLETION [NOT] PRESERVE]: Controla qué sucede con el evento una vez que su programación ha finalizado. ON COMPLETION NOT PRESERVE (por defecto) elimina el evento automáticamente después de su última ejecución. ON COMPLETION PRESERVE mantiene el evento activo incluso después de que su programación haya terminado.
  • [ENABLE | DISABLE | DISABLE ON SLAVE]: Define el estado inicial del evento. ENABLE (por defecto) activa el evento para que se ejecute según su programación. DISABLE desactiva el evento, impidiendo su ejecución. DISABLE ON SLAVE es relevante en entornos de replicación y desactiva el evento solo en el servidor réplica.
  • DO BEGIN ... END: Delimita el bloque de código SQL que se ejecutará cuando se active el evento. Dentro de BEGIN y END puedes incluir una o varias sentencias SQL.

Opciones de Programación (SCHEDULE)

La cláusula SCHEDULE es la clave para definir cuándo se ejecutará tu evento. MySQL ofrece diversas opciones:

Ejecución Única en una Fecha y Hora Específica

ON SCHEDULE AT 'YYYY-MM-DD HH:MM:SS'

Ejemplo:

ON SCHEDULE AT '2024-01-01 00:00:00'

Este evento se ejecutará una sola vez, el 1 de enero de 2024 a las 00:00:00.

Ejecución Única Después de un Periodo de Tiempo

ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL cantidad unidad_de_tiempo

Ejemplos:

ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 DAY

Se ejecutará una vez, dentro de un día desde el momento de la creación del evento.

ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 30 MINUTE

Se ejecutará una vez, dentro de 30 minutos desde la creación.

How to edit events in MySQL Workbench?
To rename an event, use the ALTER EVENT statement's RENAME TO clause. This statement renames the event myevent to yourevent : ALTER EVENT myevent RENAME TO yourevent; You can also move an event to a different database using ALTER EVENT ...

Las unidades de tiempo válidas son: SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER, YEAR.

Ejecución Periódica a Intervalos Regulares (Indefinidamente)

ON SCHEDULE EVERY intervalo unidad_de_tiempo

Ejemplos:

ON SCHEDULE EVERY 1 HOUR

Se ejecutará cada hora, indefinidamente.

ON SCHEDULE EVERY 7 DAY

Se ejecutará cada 7 días (semanalmente), indefinidamente.

Ejecución Periódica a Intervalos Regulares Durante un Periodo Específico

ON SCHEDULE EVERY intervalo unidad_de_tiempo STARTS fecha_inicio ENDS fecha_fin

Ejemplo:

ON SCHEDULE EVERY 1 DAY STARTS '2024-01-01 00:00:00' ENDS '2024-01-31 23:59:59'

Se ejecutará diariamente, desde el 1 de enero de 2024 hasta el 31 de enero de 2024.

Ejemplo Práctico: Archivado de Blogs Antiguos

Consideremos el ejemplo mencionado en la información proporcionada: automatizar el archivado de entradas de blog antiguas. Supongamos que tienes una tabla blog con una columna deleted que se establece en 1 cuando una entrada se marca como eliminada. Queremos crear un evento que archive estas entradas y sus registros de auditoría asociados semanalmente.

Primero, necesitamos crear las tablas de archivo blog_archive y audit_archive (asumiendo que no existen):

CREATE TABLE `blog_archive` ( `id` mediumint(8) unsigned NOT NULL, `title` text, `content` text, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Blog posts archive'; CREATE TABLE `audit_archive` ( `id` mediumint(8) unsigned NOT NULL, `blog_id` mediumint(8) unsigned NOT NULL, `changetype` enum('NEW','EDIT','DELETE') NOT NULL, `changetime` timestamp NOT NULL, PRIMARY KEY (`id`), KEY `ix_blog_id` (`blog_id`), KEY `ix_changetype` (`changetype`), KEY `ix_changetime` (`changetime`), CONSTRAINT `FK_audit_blog_archive_id` FOREIGN KEY (`blog_id`) REFERENCES `blog_archive` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Ahora, creamos el evento en MySQL Workbench. En el editor SQL, introduce el siguiente código (adaptando el nombre del evento y la programación según tus necesidades):

CREATE EVENT `archive_old_blogs` ON SCHEDULE EVERY 1 WEEK STARTS '2024-01-07 03:00:00' -- Se ejecutará semanalmente, comenzando el domingo a las 3 AM DO BEGIN -- Copiar blogs eliminados a la tabla de archivo INSERT INTO blog_archive (id, title, content) SELECT id, title, content FROM blog WHERE deleted = 1; -- Copiar registros de auditoría asociados INSERT INTO audit_archive (id, blog_id, changetype, changetime) SELECT audit.id, audit.blog_id, audit.changetype, audit.changetime FROM audit JOIN blog ON audit.blog_id = blog.id WHERE blog.deleted = 1; -- Eliminar blogs y registros de auditoría de las tablas originales DELETE FROM blog WHERE deleted = 1; END

Haz clic en el botón de ejecutar para crear el evento. Puedes verificar que el evento se ha creado correctamente expandiendo la carpeta Events en el Navigator de MySQL Workbench. Deberías ver el evento archive_old_blogs en la lista.

Modificando un Evento Existente (ALTER EVENT)

Si necesitas cambiar la programación, el código SQL o cualquier otra propiedad de un evento, puedes utilizar la sentencia ALTER EVENT. En MySQL Workbench, puedes modificar un evento existente de dos maneras:

  1. Interfaz Gráfica: Haz clic derecho sobre el evento en la lista de eventos y selecciona Alter Event.... Se abrirá el editor SQL con la sentencia ALTER EVENT para ese evento. Puedes modificar la sentencia directamente o utilizar las pestañas del editor para cambiar diferentes propiedades del evento de forma visual.
  2. Sentencia SQL: Puedes escribir directamente la sentencia ALTER EVENT en el editor SQL. La sintaxis general es:
    ALTER EVENT `nombre_del_evento` [ON SCHEDULE schedule] [ON COMPLETION [NOT] PRESERVE] [RENAME TO `nuevo_nombre_del_evento`] [ENABLE | DISABLE | DISABLE ON SLAVE] [COMMENT 'comentario'] [DO BEGIN -- nuevo código SQL END]

Puedes modificar cualquier parte del evento utilizando ALTER EVENT. Por ejemplo, para cambiar la programación de un evento llamado mi_evento para que se ejecute diariamente en lugar de semanalmente, usarías:

ALTER EVENT `mi_evento` ON SCHEDULE EVERY 1 DAY;

Para desactivar un evento temporalmente:

ALTER EVENT `mi_evento` DISABLE;

Para volver a activarlo:

ALTER EVENT `mi_evento` ENABLE;

Eliminando un Evento (DROP EVENT)

Para eliminar un evento que ya no necesitas, utiliza la sentencia DROP EVENT. En MySQL Workbench, puedes eliminar un evento haciendo clic derecho sobre él en la lista de eventos y seleccionando Drop Event.... También puedes ejecutar la sentencia SQL directamente:

DROP EVENT `nombre_del_evento`;

Ten cuidado al eliminar eventos, ya que esta acción es irreversible.

How to enable event in MySQL?
If the event scheduler event is not enabled, you can set the event_scheduler system variable to enable and start it using below Command. SET GLOBAL event_scheduler = ON; Now again execute “SHOW PROCESSLIST” Command. And you will get an output.

Eventos vs. Triggers: ¿Cuál es la Diferencia?

Es común confundir eventos y triggers en MySQL, ya que ambos son mecanismos para automatizar tareas en la base de datos. Sin embargo, existen diferencias fundamentales:

CaracterísticaEventosTriggers
ActivaciónBasada en el tiempo (programación)Basada en eventos de datos (INSERT, UPDATE, DELETE)
Propósito principalTareas programadas, mantenimiento periódico, tareas batchValidación de datos, auditoría, acciones reactivas a cambios en los datos
EjecuciónEjecutados por el Event SchedulerEjecutados automáticamente por el motor de la base de datos en respuesta a eventos de datos
Casos de usoArchivado de datos, informes periódicos, limpieza de datos, optimizaciónControl de integridad de datos, registro de cambios, acciones en cascada

En resumen, los eventos son ideales para tareas que necesitan ejecutarse en momentos específicos o a intervalos regulares, independientemente de la actividad de los datos. Los triggers, por otro lado, son perfectos para responder inmediatamente a cambios en los datos y garantizar la integridad y la consistencia de la base de datos.

Preguntas Frecuentes (FAQs) sobre Eventos en MySQL

¿Cómo puedo ver la lista de eventos existentes en mi base de datos?

Puedes ver la lista de eventos utilizando MySQL Workbench expandiendo la carpeta Events en el Navigator. También puedes ejecutar la siguiente consulta SQL:

SHOW EVENTS FROM nombre_de_la_base_de_datos;

¿Puedo ejecutar sentencias complejas dentro de un evento?

Sí, puedes incluir múltiples sentencias SQL dentro del bloque DO BEGIN ... END de un evento, incluyendo sentencias INSERT, UPDATE, DELETE, llamadas a procedimientos almacenados, y más. Puedes crear lógica compleja dentro de tus eventos.

¿Qué permisos necesito para crear y gestionar eventos?

Necesitas el privilegio EVENT para la base de datos donde deseas crear eventos. Para modificar o eliminar eventos, también necesitas este privilegio.

¿Puedo programar eventos para que se ejecuten con más frecuencia que por minuto?

La resolución mínima para la programación de eventos es de 1 minuto. No puedes programar eventos para que se ejecuten con una frecuencia de segundos.

¿Qué ocurre si un evento tarda más en ejecutarse que el intervalo de programación?

Si un evento programado para ejecutarse cada minuto tarda más de un minuto en completarse, la siguiente ejecución del evento se retrasará. MySQL no ejecutará instancias superpuestas del mismo evento. Asegúrate de que el intervalo de programación sea suficiente para que el evento se complete antes de la siguiente ejecución programada.

Los eventos programados en MySQL son una herramienta poderosa para la automatización de tareas en bases de datos. Utilizando MySQL Workbench, la creación y gestión de eventos se vuelve más sencilla y visual. Comprender cómo funcionan los eventos y cómo configurarlos te permitirá optimizar tus bases de datos, automatizar tareas repetitivas y mejorar la eficiencia general de tus aplicaciones.

Subir