Você está na página 1de 3

Cómo crear triggers en MySQL 5

BBDD
David | 27/03/2008

Otra de las nuevas características incluidas en MySQL, además de los procedimientos almacenados,
son los triggers, que traducido sería algo así como disparadores, son oyentes, que se mantienen a
la escucha de los eventos que puedan producirse en una tabla (insert , update y delete) y
ejecutan un código antes (before) o después (after) de que se produzca este evento.

Con los triggers podemos hacer cosas tan interesantes como mantener un log de que usuarios hace
modificaciones en una tabla, que usuarios borran registros, o insertan, o lo que se te ocurra.

Para referenciar las columnas de antes y después de que el vento se haya disparado, se usan las
palabras clave OLD y NEW. Con la sentencia insert solo se permite NEW, con update se permiten
ambas y con delete solo OLD.

Sintaxis necesaria para crear un trigger

CREATE TRIGGER <nombre>


{BEFORE|AFTER}
{INSERT|UPDATE|DELETE}
ON
<tablename>
FOR EACH ROW
BEGIN
<sentenciasSQL>
END;

Para poner nombre a los triggers es conveniente seguir una convención que hará más fácil
identificar sobre que evento y tabla actúa el trigger. Esta sería una buena forma de nombrar
nuestros triggers:

NombreTabla + “_” + abreviatura_tipo_tigger

Por lo tanto para nombrar un triger que se ejecuta sobre la tabla T1 después de un update lo
haríamos de la siguiente forma si seguimos esta convención:

“T1_BU”

Esto puede ser útil, pero no es necesario, puedes poner el nombre que quieras a tu trigger.

Para crear triggers en una tabla es necesario hacerlo desde un usuario con permisos para ello.
Para dar permiso a un usuario en una tabla para crear un trigger lo haríamos de la siguiente
forma:

GRANT CREATE TRIGGER ON nombreTabla TO Usuario


Vamos a ver un ejemplo sencillo:

Creamos la tabla miTabla

CREATE TABLE miTabla( id int , nombre varchar(50) );

Y después creamos un trigger que va a crear una variable global con el nombre antiguo antes de
ejecutar el update y otra con el nombre nuevo que habrá después de ejecutar el update.

delimiter //
CREATE TRIGGER miTabla_bu before UPDATE
ON miTabla
FOR each row
begin
SET @nombreViejo = OLD.nombre;
SET @nombreNuevo = NEW.nombre;
end//

Vamos a ver otro tigger :

CREATE TRIGGER miTabla_bi


before INSERT ON miTabla
FOR each row
begin
SET @x = 'Trigger activado';
SET NEW.nombre = ‘Valor introducido desde el TRIGGER’;
end//

En esta ocasión, cada vez que se haga un insert sobre la tabla miTabla, se creará una variable
global con el valor ‘Trigger activado’ y modificará el valor que se insertará en la columna nombre,
por lo que siempre se insertará el valor ‘Valor introducido desde el trigger’.

Si lo que queremos es mantener el control de una tabla para ver quien la modifica y a que hora,
podemos crear una tabla donde iremos anotando quien hace cada modificación y anotar los
cambios.

Creamos la tabla auxiliar

CREATE TABLE controlMiTabla


(
id int NOT NULL AUTO_INCREMENT,
id_registro int,
anterior_nombre varchar(50),
nuevo_nombre varchar(50),
usuario varchar(40),
modificado datetime,
PRIMARY KEY(id)
) ENGINE = InnoDB;

Y ahora vamos a crear un trigger que se encargue de llevar un log de quien actualiza la tabla,
que valores modifica y a que hora:

delimiter //
CREATE TRIGGER MiTabla_BU after UPDATE ON miTabla
FOR each row
begin
INSERT INTO controlMiTabla (id_registro, anterior_nombre , nuevo_nombre,
usuario , modificado ) VALUES(OLD.id , OLD.nombre , NEW.nombre, CURRENT_USER(), NOW()
);
end//

Y ya tenemos nuestro trigger creado, con el cual llevaremos el control de la tabla.

Esto es recomendable hacerlo solo en las tablas de importancia critica, ya que si no nuestra base
de datos crecerá de forma innecesaria.

Você também pode gostar