Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Se crean para conservar la integridad referencial y la coherencia entre los datos entre
distintas tablas.
Mediante las palabras claves before (antes), after (después) indicamos en que momento
se ejecutará el bloque del trigger.
Luego indicamos para cual comando SQL se invocará el trigger, pudiendo ser cualquiera
de los tres comandos SQL: INSERT, UPDATE o DELETE.
Problema resuelto
Necesitamos almacenar en una tabla llamada "usuarios" los datos de los usuarios de un
sitio web. Cada vez que el usuario cambia su clave se debe almacenar en otra tabla
llamada "clavesanteriores" el dato de la clave vieja.
Este trigger se dispara cada vez que ejecutemos el comando SQL 'update' con la tabla
'usuarios':
before update
on usuarios
El bloque del disparador se encuentra encerrado entre las palabras claves 'begin' y 'end'.
Nuestro algoritmo es ejecutar un comando SQL insert en la tabla 'clavesanteriores'
insertando el nombre de usuario y clave previo a ser cambiado por el comando 'update' en
la tabla 'usuarios'.
Mediante las palabras claves 'old' y 'new' podemos acceder a los valores actuales de la
fila y los valores que se actualizarán en la tabla 'usuarios':
old.nombre y old.clave
new.nombre y new.clave
El trigger no se ejecuta ya que solo hemos definido que se dispare para el comando
'update'.
Podemos comprobar que tenemos ahora una fila que contiene los datos:
nombre: marcos
clave: 123abc
Podemos comprobar que tenemos ahora dos filas que contiene los datos:
nombre: marcos
clave: 123abc
nombre: marcos
clave: 999zzz
Con el trigger logramos tener el historial de todas las claves empleadas por los usuarios.
Tener en cuenta que la última clave elegida por el usuario se encuentra en la tabla
'usuarios':
select * from usuarios;
Hemos dicho que un trigger se asocia a una tabla y a un evento en particular (insert,
delete o update):
Problema
Administrar los datos de dos tablas llamadas: "libros" y "ventas". Cada vez que se
produzca la venta de libros reducir el campo stock de la tabla "libros" mediante un trigger
definido en la tabla ventas.
delimiter //
create trigger before_ventas_insert
before insert
on ventas
for each row
begin
update libros set stock=libros.stock-new.cantidad
where new.codigolibro=libros.codigo;
end //
delimiter ;
La lógica que implementamos dentro del trigger consiste en reducir el stock actual del libro
que se vende: