Objetos de bases de datos. Triggers o desencadenadores de tabla.

Creado por David Miralpeix, Modificado el Fri, 16 Feb 2024 a las 12:24 PM por David Miralpeix

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í

<< Artículo anterior                                                                                                                                    Siguiente artículo >>

¿Le ha sido útil este artículo?

¡Qué bien!

Gracias por sus comentarios

¡Sentimos mucho no haber sido de ayuda!

Gracias por sus comentarios

¡Háganos saber cómo podemos mejorar este artículo!

Seleccione al menos una de las razones
Se requiere la verificación del CAPTCHA.

Sus comentarios se han enviado

Agradecemos su esfuerzo e intentaremos corregir el artículo