Triggers en MySQL 5

Triggers en MySQL 5

p>¿Qué son los triggers?

Los Triggers son simplemente procedimientos guardados en la base de datos que se ejecutan antes (BEFORE) y/o después (AFTER) de algún(os) eventos (INSERT, DELETE, UPDATE) sobre la tabla que fue asociada al trigger.

Tienen dos palabras claves, OLD y NEW que simbolizan los valores anteriores o nuevos de la columna.

  • Los INSERT permiten NEW
  • Los DELETE sólo OLD
  • Los UPDATE ambas, NEW y OLD.

Esta es el la estructura de como se declara un trigger:

CREATE TRIGGER [ Nombre_de_Trigger ] 
[ Momento ] [ Evento ] ON [ Nombre_de_Tabla ]
FOR EACH ROW
[ Sentencia_SQL ]

Donde:

  • Nombre_de_Trigger: Es el nombre que identificara al trigger
  • Momento: Sera cuando se ejecute ( BEFORE, AFTER )
  • Evento: Proceso el cual llamara al trigger ( INSERT, UPDATE, DELETE )
  • Sentencia_SQL: SQL que se ejecutara al realizar la acción anterior
  • Un ejemplo de trigger seria guardar un log de cambios de datos de un usuario.

    Primero crearemos la tabla `user`

    CREATE TABLE `user`(
    	`id`      int not null auto_increment,
            `name`  varchar(100),
            `email` varchar(50),
            PRIMARY KEY(id)
    ) ENGINE = InnoDB;
    

    Insertaremos un par de registros

    INSERT INTO `user` (`name`, `email`) VALUES
    ('Cesar', 'cesar@tednologia.com'),
    ('Maria', 'maria@gmail.com'),
    ('Jose', 'j0s3@hotmail.com'),
    ('Albert','albertpr@yahoo.com');
    

    Esta sera la tabla de logs que guardara los datos históricos del usuario

    CREATE TABLE log_user
    (
    	`id`          int not null auto_increment,
    	`name`        varchar(100),
    	`email`       varchar(50),
    	`id_user`     int not null,
    	`user`        varchar(40),
    	`date_update` datetime,
    	primary key(id)
    ) ENGINE = InnoDB;
    

    y finalmente un trigger que se disparará cada vez que alguien modifique un dato de la tabla clientes y lo guardará en una tabla junto al nombre del usuario y la fecha.

    Ahora crearemos nuestro trigger llamado “trigger_log_users” que se ejecutara justo despues de actualizar la tabla `user` y guardara los datos anteriores de `user` en la tabla `log_user`

    CREATE TRIGGER trigger_log_users AFTER UPDATE ON `user` 
       FOR EACH ROW
       INSERT INTO log_user(`name`, `email`, `id_user`, `user`, `date_update` )
       VALUES (OLD.`name`, OLD.`email`, OLD.`id`, CURRENT_USER(), NOW() );
    

    Recursos

4 Comments

  1. Triggers en MySQL 5 - DbRunas
    feb 11, 2009 @ 20:08:57

  2. Alee
    feb 25, 2009 @ 15:53:29

    Pero cuando se realiza el cambio con el trigger, toma la ultima modificacion (insert) o clona toda la base de datos?

    • admin
      feb 26, 2009 @ 23:05:39

      Los trigger no clonan la base de datos, solo toman el dato del campo que quieres, si pusiste OLD.campo tomara el valor anterior, si pusiste NEW.campo, tomara el nuevo valor del registro. (en caso de insert solo permite NEW.campo).

      Saludos.

  3. Fernando
    may 24, 2010 @ 10:17:32

    Sin tener experiencia en trigger ,pude implementar el ejemplo en mi base de datos.Me gustó la claridad como se expuso el tema y destaco los atajos “copy to clipboard” que sirvieron para no pasar errores,muy profesional.Gracias