Desencadenadores en SQL Server
Podemos escribir desencadenadores para INSERT, UPDATE, DELETE y UPDATE OF.
INSERT se dispara al insertar un nuevo registro
UPDATE se dispara al modificar un registro
DELETE se dispara al borrar un registro
UPDATE OF se dispara al modificar una columna concreta de un registro
El desencadenador puede ser para uno de los eventos o para todos a la vez.
La manera de crear un nuevo trigger en el SQL es la siguiente:
CREATE TRIGGER [MiTrigger] ON [Tabla] —Nombre del trigger y a que tabla afectara
FOR INSERT, UPDATE, DELETE —Los eventos en los que queremos que se dispare
AS
— Aquà ponemos el código
Para que se dispare al actualizar una columna especifica
CREATE TRIGGER [MiTrigger] ON [Tabla]
FOR UPDATE OF NombreDeColumna — La columna que tiene que ser modificada para que el evento se dispare
AS
— Aquà ponemos el código
Desde los triggers tenemos acceso a dos tablas virtuales del SQL con las cuales podemos saber los valores del registro que
dispara el trigger, estas tablas son Inserted y Deleted.
Estas tablas funcionan de la siguiente manera.
INSERT: Tenemos los valores del registro en la tabla Inserted.
UPDATE: Los valores antiguos los encontramos en Deleted, los nuevos en Inserted.
DELETE: Tenemos los valores del registro en la tabla Deleted.
Para acceder a estos valores, lo podemos hacer de la siguiente manera, cambiando Inserted por Deleted según el trigger y
el valor al que queramos acceder:
DECLARE @Id int
SELECT @Id = (SELECT Id FROM Inserted)
Podemos abortar transacciones desde los triggers, para eso disponemos de RollBack Tran, usándolo podemos abortar
la transacción desde el trigger y lanzar un error al cliente con RAISE ERROR, además, igual que en los procedimientos,
la variable @@error contendrá el numero, si lo hay, del ultimo error.
IF @@error <> 0 BEGIN
RollBack Tran
RAISE ERROR (Error ,16, 1)
END
Por último es importante saber que, al escribir el código en los desencadenadores no podemos usar las siguientes funciones:
ALTER DATABASE
CREATE DATABASE
DROP DATABASE
LOAD DATABASE
RESTORE DATABASE
DISK INIT
DISK RESIZE
LOAD LOG
RECONFIGURE LOG
RESTORE LOG


