martes, 23 de marzo de 2010

Triggers en MySQL

A partir de MySQL 5.0.2 se incluyó soporte básico para triggers. Por ahora es muy básico y limitado, pero aún así es una importante feature. En este artículo voy a explicar que son los triggers y como se usan en MySQL.

Que son los triggers


Los triggers (disparadores en español) son acciones que pueden ejecutarse de manera automática cuando determinado evento ocurre en una tabla.

Al crear un trigger, se le asocia con una tabla, y se lo programa para que se active antes o después de la ejecución de que una sentencia del tipo INSERT, DELETE o UPDATE ocurra en esa tabla. Básicamente un trigger se compone de tres partes:


  • Evento


    Es el evento que tiene que ocurrir para que el trigger se active. Puede ser una sentencia INSERT, DELETE o UPDATE


  • Restricción


    Una vez activado el trigger, se puede evaluar una condición, para saber si ejecutarlo o no.


  • Acción


    La acción que realiza el trigger al ejecutarse.


Como se usan los triggers


Para crear un trigger se usa la sentencia CREATE TRIGGER, junto a cláusulas que le indican cuando activarse y que hacer cuando se active. Veamos un ejemplo:



Tenemos la tabla test, con los campos id, name y date. Vamos a crear un trigger para que cada vez que se inserte un registro en la tabla, se inserte automáticamente la fecha en el campo date.

[sourcecode language="sql"]DELIMITER //
CREATE TRIGGER set_date
BEFORE INSERT ON test
FOR EACH ROW BEGIN
SET NEW.date = NOW();
END;
//[/sourcecode]

NOTA: usamos la sentencia DELIMITER para poder usar “//” como delimitador en vez de “;”.

Veamos parte por parte que fue lo que hicimos:


  • CREATE TRIGGER set_date


    Creamos el trigger con la sentencia CREATE TRIGGER y lo nombramos como set_date.


  • BEFORE INSERT ON test


    Le dijimos que se ejecute antes (BEFORE) de que se ejecute una sentencia INSERT en la tabla test (INSERT ON test).


  • FOR EACH ROW BEGIN


    Comenzamos un bucle en el que le indicamos que hacer por cada vez que se active el trigger.


  • SET NEW.date = NOW();


    Le indicamos la acción a realizar al ejecutarse el trigger. En este caso, insertar en el campo date la fecha actual, con NEW.date nos estamos refiriendo al campo del registro que se va a insertar. Y con NOW() obtenemos la fecha actual.


Ahora cada vez que insertemos un nuevo registro en la tabla test, se va a insertar la fecha actual automáticamente en el campo date.

Si por alguna razón, quisiéramos que el trigger no se ejecute más, debemos eliminarlo. Para eliminar un trigger, se utiliza la sentencia DROP TRIGGER indicándole el nombre del trigger a borrar, en nuestro ejemplo sería algo así:

[sourcecode language="sql"]DROP TRIGGER set_date;[/sourcecode]

NOTA: no olvidar volver a poner el delimitador como “;”. (DELIMITER ;).

Un ejemplo un poco más interesante


Antes habíamos dicho que un trigger tiene tres partes: un evento, una restricción y una acción. En el ejemplo anterior teníamos el evento y la acción, pero no usamos ninguna restricción. Veamos otro ejemplo en el que usemos una restricción:

Tenemos una tabla employers, con los campos id, name y salary. Vamos a crear un trigger que verifique que el valor del campo salario sea siempre positivo.

Con este trigger nos aseguramos de que cada vez que se actualice un registro, el valor de salary siempre sea positivo.

[sourcecode language="sql"]DELIMITER //
CREATE TRIGGER positive_update
BEFORE UPDATE ON employers
FOR EACH ROW BEGIN
IF NEW.salary < 0
THEN SET NEW.salary=OLD.salary;
END IF;
END;
//[/sourcecode]

Los puntos importantes de esto serían:


  • IF NEW.salary < 0


    Con eso verificamos si el nuevo valor para el campo salary (NEW.salary) es menor a cero.


  • THEN SET NEW.salary=OLD.salary;


    Si la condición anterior se cumple, entonces el nuevo valor de salary va a ser igual al viejo valor de salary (OLD.salary).


Para insertar, hacemos un trigger parecido, pero si el valor de salary es menor a cero, entonces cambia el valor a cero:

[sourcecode language="sql"]DELIMITER //
CREATE TRIGGER positive_insert
BEFORE INSERT ON employers
FOR EACH ROW BEGIN
IF NEW.salary < 0
THEN SET NEW.salary=0;
END IF;
END;
//[/sourcecode]

NOTA: para que un usuario pueda crear triggers, necesita el privilegio SUPER.

Bueno, todavía es algo muy limitado el tema de los triggers en MySQL. Pueden consultar más sobre triggers en la info. oficial de MySQL sobre triggers.

LINK DE ARTÍCULO: AQUÍ

1 comentario:

  1. Una pregunta: Como hacer un trigger para comparar que los campos de una tabla no se dupliquen? Sé que se puede hacer con las llaves principales, pero tambien quisiera hacer un trigger que primero verifique que no exista, digamos, dos fechas duplicadas tomando en cuenta que la llave principal sea el ID, pues cambiando el ID con fechas diferentes son campos diferentes. Sé que podría evitarlo colocando la ID con la fecha como llave principal, pero en sí me resultaría interesante conocer la solucion mediante triggers, además de que el ejemplo se me vino en este momento a la mente.

    ResponderBorrar