¿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@craftyman.net'),
('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() );





February 11th, 2009 at 8:08 pm
[...] http://craftyman.net/triggers-en-mysql-5/ [...]
February 25th, 2009 at 3:53 pm
Pero cuando se realiza el cambio con el trigger, toma la ultima modificacion (insert) o clona toda la base de datos?
February 26th, 2009 at 11:05 pm
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.
May 24th, 2010 at 10:17 am
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