Академический Документы
Профессиональный Документы
Культура Документы
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.
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:
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:
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//
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.
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//
Esto es recomendable hacerlo solo en las tablas de importancia critica, ya que si no nuestra base
de datos crecerá de forma innecesaria.