Disparadores (triggers)


Disparadores(triggers)

Un trigger es un procedimiento que se ejecuta cuando se cumple una condición establecida al realizar una operación. Dependiendo de la base de datos, los triggers pueden ser de inserción (INSERT), actualización (UPDATE) o borrado (DELETE)
Es decir, son objetos que se asocian a una tabla y se activan cuando ocurre un determinado evento en dicha tabla, por ejemplo, cuando agregamos un nuevo registro.



Sintaxis:

CREATE TRIGGER [nombre_del_trigger]
[momento] [evento]
ON [nombre_tabla] FOR EACH ROW
BEGIN 
   [proceso]
END;

Donde:
[nombre_del_trigger]
  --> nombre del disparador, debe ser único.
[momento]
--> determina cuando se ejecutara el disparador, puede ser BEFORE (antes) o AFTER (después) del evento.
[evento]
--> determina que proceso (setencia) llamara al disparador, puede ser INSERT (insertar), UPDATE (actualizar) o DELETE (eliminar) datos.
[nombre_tabla] --> será la tabla a la que se asigne el disparador (trigger).
[proceso]
--> determina las instrucciones a seguir, bien prodria ser una sola sentencia y no haría falta en ese caso usar la sentencia compuesta BEGIN ..END, de lo contrario, es necesario.

El siguiente trigger se ejecuta después de la creación de un nuevo registro:


CREATE TRIGGER trigger_log_articulos 
AFTER 
   INSERT ON articulos
FOR EACH ROW
   INSERT INTO log_articulos(fecha,usuario,proceso,id_articulo)
   VALUES (NOW(),CURRENT_USER(),'1',NEW.id_articulo);
 
 
 Almacenará la fecha de la inserción, el nombre del usuario, el tipo de proceso y el id del registro agregado.


Ejemplo practico:
mysql> -- creamos la base de datos
mysql> CREATE DATABASE triggers_db;
Query OK, 1 row affected (0.00 sec)

mysql> -- seleccionamos la db
mysql> USE triggers_db;
Database changed

mysql> -- tabla donde se almacenan los artículos
mysql> CREATE TABLE articulos(
    ->    id_articulo int not null auto_increment primary key,
    ->    titulo varchar(200) not null,
    ->    contenido Blob not null, -- máximo de 65.535 caracteres
    ->    autor varchar(25) not null, -- podría ser el id de una tabla "usuarios"
    ->    fecha_pub datetime not null, -- fecha de la publicacion
    ->    estado bool not null default 1 -- 1 ó 0
    -> ) ENGINE = InnoDB;
Query OK, 0 rows affected (0.15 sec)

mysql> -- tabla que almacena los proceso realizados sobre la tabla "articulos"
mysql> CREATE TABLE log_articulos
    -> (
    ->    id_log_art int not null auto_increment primary key,
    ->    fecha datetime, -- fecha del proceso
    ->    usuario varchar(40), -- usuario implicado
    ->    proceso varchar(10), -- agregado, editado, eliminado
    ->    articulo varchar(200) not null -- titulo del articulo  
    -> ) ENGINE = InnoDB;
Query OK, 0 rows affected (0.13 sec)

mysql> -- creamos el disparador
mysql> CREATE TRIGGER tgr_ins_logarticulos
    -> AFTER 
    ->    INSERT ON articulos
    -> FOR EACH ROW
    ->    INSERT INTO log_articulos(fecha,usuario,proceso,articulo)
    ->       VALUES (NOW(),CURRENT_USER(),'agregado',NEW.titulo);
Query OK, 0 rows affected (0.09 sec)

mysql> INSERT INTO articulos (titulo,contenido,autor,fecha_pub) VALUES 
    -> ('ejemplo de triggers en MySQL','contenido..','autor_x',NOW());
Query OK, 1 row affected (0.07 sec)

mysql> select * from log_articulos;
+------------+---------------------+----------------+----------+------------------------------+
| id_log_art | fecha               | usuario        | proceso  | articulo                     |
+------------+---------------------+----------------+----------+------------------------------+
|          1 | 2011-07-25 17:20:14 | root@localhost | agregado | ejemplo de triggers en MySQL |
+------------+---------------------+----------------+----------+------------------------------+
1 row in set (0.00 sec)

En el ejemplo se ve, que una vez se inserta un registro en la tabla articulos, el trigger se ejecuta y 
almacena datos de la operación en la tabla log_articulos.



Si en una misma sentencia insertamos más de un registro, se dispararan tantos procesos como registros haya. 

No hay comentarios:

Publicar un comentario