Marco Teórico
¿Qué es un TRIGGER SQL?
Un TRIGGER, también conocido como disparador, es una especie de script de
programación SQL para base de datos. Los TRIGGER son procedimientos que se
ejecutarán según nuestras indicaciones cuando se realicen operaciones sobre la
información de la base de datos. Estas operaciones pueden ser de actualización
(UPDATE), inserción (INSERT) y borrado (DELETE).
Los TRIGGER además pueden modificar la información de la base de datos e incluso
detener la ejecución de consultas erróneas.
¿Para qué sirve un TRIGGER SQL?
Los TRIGGERS son una de las funcionalidades más útiles de las que
disponemos cuando diseñamos y mantenemos bases de datos. Gracias a ellos podremos
implementar ciertas características de nuestra base de datos sin necesidad de desarrollar
programación en otros lenguajes externos.
Imagínate por ejemplo que quieres duplicar en una segunda tabla toda la información
que se inserte en otra. No existe ninguna forma de indicarle a la base de datos que lo
realice de forma automática. Sin embargo, gracias a un TRIGGER que se ejecute tras un
INSERT, podemos insertar esa información en la segunda tabla, todo esto sin que el
usuario/programador que lanzó el INSERT tenga que hacer nada.
¿Como crear un TRIGGER SQL?
Crear un TRIGGER con SQL es sencillo, casi todos los sistemas de bases de datos
(SGBD) están preparados para ello, e incluso algunos pueden incorporar un
asistente que nos guie en el proceso.
Estructura de un trigger
La creación de un TRIGGER sigue las bases de crear un procedimiento almacenado o
una función almacenada. Primero declaramos un delimitador y usamos la sentencia
CREATE:
CREATE TRIGGER trigger histórico
En estas líneas SQL he creado un TRIGGER con el nombre trigger_historico. Este
nombre me servirá después para identificarlo, pudiendo así borrarlo o buscarlo en la
base de datos.
A continuación, debemos indicar cuando debe ejecutarse el TRIGGER. Las
indicaciones posibles en este punto son AFTER o BEFORE para indicar si el disparador
se ejecutará antes o después de la orden lanzada por el usuario. Estas órdenes
serán: INSERT, DELETE o UPDATE. Por último, indicaremos sobre que tabla actuará.
Vamos a completar el código anterior indicando que la ejecución será tras un
INSERT en la tabla usuario:
CREATE trigger_historico
AFTER INSERT ON usuario
FOR EACH ROW
Como se puede ver se añadido las dos últimas líneas: la primera indica que la ejecución
será tras una inserción en la tabla usuario, mientras que la segunda forma parte de
la estructura de un TRIGGER e indica que se debe aplicar a cada fila insertada.
Por último, mediante el comando BEGIN y END indicamos las líneas de código SQL
que ejecutará el TRIGGER:
CREATE trigger_historico
AFTER INSERT ON usuario
FOR EACH ROW
BEGIN
// líneas de código SQL que se ejecutarán
END
Datos nuevos y antiguos. El OLD y el NEW
Para que nuestras líneas de código SQL puedan acceder a la información que interviene
en el TRIGGER, es decir, la información a la que afecta un UPDATE, INSERT o
DELETE, disponemos de dos variables especiales NEW y OLD.
La variable NEW de un TRIGGER
NEW es la variable que almacena la nueva información que aporta la consulta a la base
de datos, es decir, cada una de las filas que intervienen en un INSERT O UPDATE. Si
por ejemplo se ha realizado un INSERT, gracias a NEW podremos acceder a los datos
introducidos para cada columna de la tabla. [Link] por ejemplo almacena la
información de la columna nombre que tendrá el nuevo registro insertado en la tabla.
Hay que tener en cuenta que NEW no estará disponible en todos los tipos de TRIGGER.
En concreto los TRIGGER relacionados con un DELETE no dispondrán de información
en esta variable ya que tan solo tendremos información antigua que es eliminada.
La variable OLD de un TRIGGER
OLD es la variable que almacena la información antigua relacionada con la consulta que
ejecuta el TRIGGER, esta información la componen las filas que van a ser borradas o
modificadas. En un DELETE, por ejemplo, OLD tendrá la información de todas las
columnas de los registros borrados.
Al igual que NEW no está disponible para todos los TRIGGER que creemos, la variable
OLD no podrá ser utilizada para un INSERT, ya que en este tan solo existe nueva
información que va a ser insertada en la base de datos.
Predicados condicionales
Cuando se crea un trigger para más de una operación DML, se puede utilizar un
predicado condicional en las sentencias que componen el trigger que indique que tipo de
operación o sentencia ha disparado el trigger. Estos predicados condicionales son los
siguientes:
Inserting: Retorna true cuando el trigger ha sido disparado por un INSERT
Deleting: Retorna true cuando el trigger ha sido disparado por un DELETE
Updating: Retorna true cuando el trigger ha sido disparado por un UPDATE
Updating (columna): Retorna true cuando el trigger ha sido disparado por
un UPDATE y la columna ha sido modificada.
Tipos de Triggers
Los triggers pueden definirse para las operaciones INSERT, DELETE o UPDATE, y
pueden dispararse antes o después de la operación. Finalmente, el nivel de los
disparadores puede ser la fila o registro o la orden.
El modificador BEFORE o AFTER indica que el trigger se ejecutará antes o después de
ejecutarse la sentencia SQL definida por DELETE, INSERT o UPDATE. Si incluimos
el modificador OF el trigger solo se ejecutará cuando la sentencia SQL afecte a los
campos incluidos en la lista.
El alcance de los disparadores puede ser la fila o de orden. El modificador FOR EACH
ROW indica que el trigger se disparará cada vez que se realizan operaciones sobre cada
fila de la tabla. Si se acompaña del modificador WHEN, se establece una restricción; el
trigger solo actuará, sobre las filas que satisfagan la restricción.
Ejemplo1 de un TRIGGER
Vamos a resolver un TRIGGER que nos permita mantener una copia de todos los
clientes que se inserten en una base de datos de una tienda online. Para esto tendremos
dos tablas: cliente y cliente_historico. Así, el siguiente TRIGGER insertará toda la
información del cliente (nombre, dni, direccion) más una columna extra: fecha_registro.
CREATE TRIGGER trigger_cliente_historico
AFTER INSERT ON cliente
FOR EACH ROW
BEGIN
INSERT INTO cliente_historico (nombre, dni, direccion)
VALUES ([Link], [Link], [Link], CURDATE ());
END
Ejemplo2 de un TRIGGER
El siguiente trigger insertara un valor nuevo en un campo único identificador tras una
actualización de datos en la tabla usuario_web.
CREATE TRIGGER trigger_usuario_identificador
AFTER INSERT ON usuario
FOR EACH ROW
BEGIN
UPDATE usuario SET identificador=CONCAT([Link],'_',[Link],
'_',[Link])
WHERE id=[Link];
END
REFERENCIAS
[Link]
[Link]
%C3%B3n,o%20DELETE%20)%20sobre%20dicha%20tabla.