Un desencadenador es una clase especial de procedimiento almacenado que se ejecuta automáticamente cuando sobre una tabla, se ejecutan sentencias de INSERT, UPDATE o DELETE.
En los triggers tenemos a nuestra disposición las tablas del sistema ‘inserted’ Y ‘deleted’. Por ejemplo, en un trigger de DELETED podemos consultar el registro eliminado mirando la tabla ‘deleted’ (en la tabla en la que se realiza el borrado ya no dispondremos del registro).
En un trigger de INSERT podemos consultar los registros que se insertan comprobando la tabla ‘inserted’. El nuevo registro (o registros insertados) existen tanto en la tabla en la que se realiza la inserción como en la tabla ‘inserted’.
Y en un trigger de UPDATE, podemos consultar los valores antiguos, antes de modificar, en la tabla ‘deleted’ y los nuevos valores ya modificados en la tabla ‘inserted’. La tabla en la que se realiza la modificación ya tiene los valores modificados.
Nunca hay que olvidar que en las tablas ‘inserted’ y ‘deleted’ puede tener uno o varios registros, así que no se deben de realizar asignaciones del estilo:
SELECT @IdPedido=IdPedido FROM Inserted
Se pueden definir un determinado orden de ejecución de los triggers, así como su deshabilitación. Esta es la sentencia para la definición del orden de ejecución de los triggers:
sp_settriggerorder @triggername=’Prueba_UTrig', @order='First', @stmttype= 'UPDATE'
Ejemplo: editar triggers de inserción, borrado y modificación de la tabla Artículos y ver como se comprueba la integridad y como se borra y modifica en cascada en la tabla Almacenes_Reglas_Relaciones
Ejemplo: Crear triggers de Insert, Update y Deleted sobre la tabla Articulos_Familias.
Con el siguiente código creamos trigger de inserción, modificación y actualización en la tabla Articulos_Familias para que nos inserte, elimine o actualice el correspondiente registro en la tabla Conf_Articulos_Familias.
Es necesario eliminar previamente la clave ajena de la tabla Conf_Articulos_Familias, ya que vamos hacer mediante programación el mismo borrado y modificación en cascada que ya hace de forma automática nuestra clave ajena.
Por supuesto es mucho mejor utilizar claves ajenas, ya que SQL las comprueba antes de realizar la inserción en la tabla y es más rápido.
CREATE TRIGGER [dbo].[Conf_Articulos_Familias_ITrig]
ON [dbo].[Articulos_Familias]
FOR INSERT
AS
IF EXISTS(SELECT 1 FROM inserted) BEGIN
-- insercion en Conf_Articulos_Familias
INSERT INTO Conf_Articulos_Familias (IdFamilia)
SELECT I.IdFamilia
FROM inserted I LEFT JOIN Conf_Articulos_Familias C ON I.IdFamilia=C.IdFamilia
WHERE C.IdFamilia IS NULL
END
Go
CREATE TRIGGER [dbo].[Conf_Articulos_Familias_DTrig]
ON [dbo].[Articulos_Familias]
FOR DELETE
AS
IF EXISTS(SELECT 1 FROM deleted) BEGIN
-- borrado en cascada
DELETE C
FROM deleted D INNER JOIN Conf_Articulos_Familias C ON D.IdFamilia=C.IdFamilia
END
Go
CREATE TRIGGER [dbo].[Conf_Articulos_Familias_UTrig]
ON [dbo].[Articulos_Familias]
FOR UPDATE
AS
IF EXISTS(SELECT 1 FROM inserted) BEGIN
Ejemplo: Crear Trigger de update en Conf_Articulos_Familias, para modificar el descuento
Con este trigger, cada vez que se produce una modificación sobre cualquier campo de la tabla Conf_Articulos_Familias, la columna descuento se incrementa a 100 si antes era 0
ALTER TRIGGER [dbo].[Conf_Articulos_Familias_UTrig]
ON [dbo].Conf_Articulos_Familias
FOR UPDATE
AS
IF EXISTS(SELECT 1 FROM inserted) BEGIN
UPDATE C SET Descuento= 100
FROM Conf_Articulos_Familias C INNER JOIN Inserted I ON C.IdFamilia=I.IdFamilia
WHERE C.Descuento=0
END
En estos triggers de update, en los que se vuelve a actualizar la misma tabla desde la que se dispara, hay que prestar especial atención en poner una condición de fin en la sentencia de actualización si no queremos generar un error de anidación como esta:
Conoce más sobre transact SQL consultado todo el material que tenemos publicado aquí
¿Le ha sido útil este artículo?
¡Qué bien!
Gracias por sus comentarios
¡Sentimos mucho no haber sido de ayuda!
Gracias por sus comentarios
Sus comentarios se han enviado
Agradecemos su esfuerzo e intentaremos corregir el artículo