Está en la página 1de 49

TRIGGERS,

DESENCADENADOR
ES
o
DISPARADORES
TRIGGERS
 Un trigger es un tipo especial de
procedimiento almacenado, que se
dispara conducido por un evento en
lugar de por una llamada directa.
 Responde a una acción de
modificación de datos sobre una tabla
( INSERT,UPDATE O DELETE)
TRIGGERS
Características de los
TRIGGERS
 Asociación a una tabla Los desencadenadores se definen para
una tabla específica, denominada tabla del desencadenador.
 Invocación automática Cuando se intenta insertar, actualizar o
eliminar datos de una tabla en la que se ha definido un
desencadenador para esa acción específica, el desencadenador se
ejecuta automáticamente. No es posible evitar su ejecución.
 Imposibilidad de llamada directa A diferencia de los
procedimientos almacenados del sistema normales, no es posible
invocar directamente los desencadenadores, que tampoco pasan ni
aceptan parámetros.
Usos de los TRIGGERS
 Mantener reglas de integridad de los
datos que van mas allá de la integridad
referencial simple.
 Implementar una acción referencial como
los borrados o actualizaciones en cascada
 Mantener auditoria de cambios
 Invocar una acción externa que permita
mantener las reglas de negocio.
Usos de los TRIGGERS

Realizar cambios en cascada en tablas relacionadas de una


base de datos, cuando los mismos no fueron definidos al
momento de la creación de la misma.
Ejemplo, un desencadenador de eliminación en la tabla Products
de la base de datos Northwind puede eliminar de otras tablas las
filas que tengan el mismo valor que la fila ProductID eliminada.
Para ello, el desencadenador utiliza la columna de clave externa
ProductID como una forma de ubicar las filas de la tabla Order
Details.
Usos de los TRIGGERS

Exigir una integridad de datos más compleja que una


restricción CHECK A diferencia de las restricciones CHECK,
los desencadenadores pueden hacer referencia a columnas de
otras tablas.
Ejemplo: Un desencadenador de inserción en la tabla Order
Details que compruebe la columna UnitsInStock de ese artículo
en la tabla Products. El desencadenador podría determinar que,
cuando el valor UnitsInStock sea menor de 10, la cantidad
máxima de pedido sea tres artículos. Este tipo de comprobación
hace referencia a columnas de otras tablas. Con una restricción
CHECK esto no se permite.
Usos de los TRIGGERS

Definición de mensajes de error personalizados


En ocasiones, una aplicación puede mejorarse con mensajes de
error personalizados que indiquen el estado de una acción.
Los desencadenadores permiten invocar mensajes de error
personalizados predefinidos o dinámicos cuando se den
determinadas condiciones durante la ejecución del
desencadenador.
Usos de los TRIGGERS

Mantenimiento de datos no normalizados


Habitualmente, los datos no normalizados contienen valores
calculados, derivados o redundantes. Se debe utilizar un
desencadenador en las situaciones siguientes: „La integridad
referencial requiere algo distinto de una correspondencia exacta,
como mantener datos derivados (ventas del año hasta la fecha) o
columnas indicadoras (S o N para indicar si un producto está
disponible). „ Son necesarios mensajes personalizados e
información de errores compleja.
Usos de los TRIGGERS

Comparación del estado de los datos antes y después


de su modificación
La mayor parte de los desencadenadores permiten hacer
referencia a los cambios efectuados a los datos con las
instrucciones INSERT, UPDATE o DELETE.
Esto permite hacer referencia a las filas afectadas por las
instrucciones de modificación en el desencadenador.
Resumiendo
 Un "trigger" (disparador o desencadenador) es un tipo de
procedimiento almacenado que se ejecuta cuando se intenta
modificar los datos de una tabla (o vista).
 Se definen para una tabla (o vista) específica.
 Se crean para conservar la integridad referencial y la coherencia
entre los datos entre distintas tablas.
 Si se intenta modificar (agregar, actualizar o eliminar) datos de
una tabla en la que se definió un disparador para alguna de estas
acciones (inserción, actualización y eliminación), el disparador se
ejecuta (se dispara) en forma automática.
 Un trigger se asocia a un evento (inserción, actualización o
borrado) sobre una tabla.
Resumiendo
La diferencia con los procedimientos almacenados
del sistema es que los triggers:
no pueden ser invocados directamente; al intentar
modificar los datos de una tabla para la que se ha
definido un disparador, el disparador se ejecuta
automáticamente.
no reciben y retornan parámetros.
son apropiados para mantener la integridad de los
datos, no para obtener resultados de consultas.
Resumiendo
 Podemos tener disparadores para se ejecuten antes o después del
insert, update o delete.
 Los disparadores, a diferencia de las restricciones "check", pueden
hacer referencia a campos de otras tablas. Por ejemplo, puede
crearse un trigger de inserción en la tabla "ventas" que compruebe el
campo "stock" de un artículo en la tabla "articulos"; el disparador
controlaría que, cuando el valor de "stock" sea menor a la cantidad
que se intenta vender, la inserción del nuevo registro en "ventas" no
se realice.
 Este sería un trigger que deseamos se ejecute antes de insertar las
ventas.
Restricciones vs triggers
Ventajas de las restricciones:
 Las restricciones (y reglas) son más rápidas que los
triggers
 Las restricciones no requieren codificación adicional
 Es mejor para chequear datos antes de ingresarlos a la
base de datos
Ventajas de los triggers:
 Muy flexible
 Los triggers pueden hacer cualquier cosa que se pueda codificar
 Mejor para las reglas complejas del negocio que no se
pueden expresar como restricciones referenciales tales
como actualizaciones o borrados en cascada
CREACIÓN DE TRIGGERS

Para crear un trigger se debe tener rol de administrador, o ser dueño


de la base de datos. Un trigger puede ser creado, alterado o borrado.

CREATE TRIGGER <nombre>


ON <tabla>
WITH ENCRYPTION]
{FOR | AFTER | INSTEAD OF}
{INSERT | UPDATE | DELETE}
AS
<instrucciones>o
CREATE TRIGGER <nombre>
ON <tabla-Vista>
WITH ENCRYPTION]
{FOR | AFTER | INSTEAD OF }
FORMATO
{INSERT | UPDATE | DELETE}
AS
<instrucciones>
 CREATE TRIGGER junto al nombre del disparador.
 ON seguido del nombre de la tabla o vista para la cual se establece el trigger. Sólo se
puede hacer referencia a una vista mediante un trigger INSTEAD OF.
 Luego de "for", se indica la acción (evento, el tipo de modificación) sobre la tabla o
vista que activará el trigger. Puede ser "insert", "update" o "delete". Debe
colocarse al menos UNA acción, si se coloca más de una, deben separarse con comas.
 Luego de "as" viene el cuerpo del trigger, se especifican las condiciones y acciones
del disparador; es decir, las condiciones que determinan cuando un intento de
inserción, actualización o borrado provoca las acciones que el trigger realizará.
TIPOS DE TRIGGERS
Posteriores (AFTER):
Están por defecto cuando solo se coloca la
palabra for. (no es necesaria la palabra after).
CREATE TRIGGER <nombre>
Pueden definirse varios sobre una misma tabla
ON <tabla>
Sólo puede definirse para tablas
WITH ENCRYPTION]
{FOR | AFTER | INSTEAD OF }
En lugar de (INSTEAD OF) :
{INSERT | UPDATE |
DELETE} En lugar de modificar datos, especifica una
acción a tomar.
AS
Sólo puede tenerse uno para cada acción, insert,
<instrucciones> update o delete
No pueden combinarse con llaves foráneas que
hayan sido definidas con cascade.
Pueden definirse para tablas y/o vistas
Características de los
TRIGGERS AFTER
 Las tablas pueden tener varios desencadenadores
AFTER para cualquier acción.
 SQL Server 2000 permite anidar varios
desencadenadores en una misma tabla.
 Los propietarios de las tablas pueden designar el
primer y último desencadenador que se debe activar:
para ello deben utilizar el procedimiento almacenado
del sistema sp_settriggerorder para especificar el
primer y último desencadenador que se debe activar. El
orden de activación de los demás desencadenadores no
se puede establecer.
Características de los
TRIGGERS INSTEAD OF
 INSTEAD OF indica que se ejecuta el TRIGGER en vez
de la instrucción SQL desencadenadora, por lo que se
suplantan las acciones de las instrucciones
desencadenadoras. 
 Como máximo, se puede definir un desencadenador
INSTEAD OF por cada instrucción INSERT, UPDATE o
DELETE en cada tabla o vista.
 En las vistas es posible definir otras vistas que tengan su
propio desencadenador INSTEAD OF. 
 Los desencadenadores INSTEAD OF DELETE/UPDATE
 no se permiten en tablas que tengan una clave ajena
definida con ON DELETE/UPDATE CASCADE.
Insert into titleauthor (au_id, tittle_id)
values ('998-72-3567','PS2106')

Note que la tabla Titleauthor tiene 4 campos.


Cuando creamos un trigger, el manejador crea una
“copia de la tabla asociada al trigger” y dependiendo
de si el trigger es de insersión o de eliminación, en la
copia almacena los datos que fueron enviados en la
instrucción insert o los datos del registro que fue
borrado con el delete.

Estas tablas se conocen como INSERTED y DELETED.


En este caso, la tabla que se genera es INSERTED y contendrá los
datos insertados
Las tablas inserted y deleted
 inserted y deleted son dos tablas temporales que se crean en memoria que
contienen los valores de las filas afectadas por el comando que invocó el trigger
 inserted almacena cualquier fila que se vaya a añadir a la tabla
 deleted almacena cualquier fila que se vaya a borrar de la tabla

• La tabla inserted
“inserted” contiene
contiene una copia de una copia de la(s)
todos los campos de la fila(s) insertada(s)
tabla sobre la cual
realizamos el insert

• La tabla deleted “deleted” contiene una


copia de la(s) fila(s)
contiene una copia borrada(s)
completa del registro
borrado
Inserciones

Insert into titleauthor (au_id, tittle_id)


values ('998-72-3567','PS2106’)

Triggers FOR
DELETE

 A delete adds rows to the deleted table


Trigger for UPDATE
UPDATE Publisher
set pub_id=‘9988’
where pub_id=‘9999’

 An update adds rows to both tables

Para TRIGGER UPDATE , SQL Server maneja las dos tablas lógicas “deleted”
e “inserted” para almacenar las filas antes y después de la modificación.

En la tabla inserted almacena los nuevos valores y en la deleted los que estaban
previos
Reglas para las tablas inserted y deleted

 Ambas tablas tienen las mismas columnas que la tabla


asociada al trigger
 El trigger puede consultar datos de las dos tablas
 Otros procesos no pueden consultar datos de las dos tablas
 El trigger no puede modificar datos en las dos tablas
 Cada anidamiento de triggers tiene sus propias tablas
inserted y deleted
 Si un trigger modifica datos de su tabla asociada, esos
cambios no se reflejan en las tablas inserted and deleted de
ese trigger
EJEMPLO DE CUANDO USAR UN TRIGGERS AFTER
Se realiza la acción y luego el trigger

1. Empleado 2. Actualiza la tabla


Registra un pedido por venta de PEDIDO
de un producto TABLA_PEDIDO

COD_PRODUCTO
COD_VENDEDOR
CANTIDAD
IMPORTE

TRIGGER INSERT
3. Incrementa las TABLA EMPLEADO
ventas realizadas
INSERTED
por el empleado NUM_EMP
Ventas=ventas + NOMBRE COD_PRODUCTO
importe VENTA COD_VENDEDOR
SALARIO CANTIDAD
IMPORTE
Al momento de realizar una inserción sobre una tabla que tiene definido un
INSERT TRIGGER, SQL Server maneja una tabla virtual llamada “inserted”
que contiene una copia de la(s) fila(s) insertada(s).
EJEMPLO DE CUANDO USAR UN TRIGGERS AFTER
Se realiza la acción y luego el trigger

1. Empleado
Registra un pedido por venta 2. Actualiza la tabla
de un producto de PEDIDO
Insert into TABLA_PEDIDO
(cod-prod, cod_vendedor,cantidad,importe)
Values (‘9999’, ‘E90’,100, 450.95)

La tabla inserted guarda los valores del insert


Para poder accederlos

TRIGGER INSERT
3. Incrementa las TABLA EMPLEADO
ventas realizadas
INSERTED
por el empleado NUM_EMP TABLA INSERTED
Ventas=ventas + NOMBRE COD_PRODUCTO 9999
importe VENTA COD_VENDEDOR E90
SALARIO CANTIDAD 100
IMPORTE 450.95

Al momento de realizar una inserción sobre una tabla que tiene definido un
INSERT TRIGGER, SQL Server maneja una tabla virtual llamada “inserted”
que contiene una copia de la(s) fila(s) insertada(s).
EJEMPLO TRIGGER
AFTER Queremos que cuando el
empleado realice una venta y se
inserte el pedido
automáticamente se actualice
en la Tabla_Empleado, la venta
por él realizada.
QUEREMOS QUE PRIMERO
INSERTE Y DESPUES HAGA
LO INDICADO EN EL TRIGGER

CREATE TRIGGER ActualizaVentasEmpleados


ON tabla_pedido
FOR INSERT AS
UPDATE tabla_empleado
SET ventas = ventas + inserted.importe
WHERE num_emp = inserted.COD_VENDEDOR;
Triggers FOR
ElINSERT
siguiente ejemplo muestra como al momento de realizar la
inserción sobre una tabla se puede usar la tabla lógica “inserted”.
Este ejemplo se realiza sobre la base de datos de pubs, en la
tabla de jobs.
Reportará el registro insertado. Nota: La tabla Jobs tiene 4
campos, el primero es identity

CREATE TRIGGER t_insjob


on jobs
for insert
as
select 'Registro insertado' as notificación
select * from inserted
Note que la tabla inserted tiene
TODO el registro que se insertó,
incluso el valor generado por el
identity
Triggers FOR
INSERT
Respetando las restricciones de la tabla la inserción:

insert into jobs


values ('psychologist', 120, 250)
Triggers FOR DELETE
La tabla deleted guarda todo el registro eliminado

El siguiente ejemplo muestra como al momento de realizar una


eliminación sobre una tabla se puede usar la tabla lógica “deleted”.
Este ejemplo se realiza sobre la base de datos de pubs, en la tabla de
jobs. Reportará el registro eliminado.

CREATE TRIGGER t_deljob


on jobs
for delete
as
select 'registro eliminado' as notificación
select * from deleted
CREATE TRIGGER t_deljob
on jobs
for delete
Triggers For Delete as
select 'registro eliminado'
as notificación
select * from deleted

Respetando las restricciones de la tabla la eliminación:

delete from jobs


where job_desc='psychologist'

Note que al listar la tabla deleted,


se muestra todas las columnas del registro borrado
Trigger FOR UPDATE
El siguiente ejemplo muestra como al momento de realizar una actualización
sobre una tabla se pueden usar las tablas lógicas.
Este ejemplo se realiza sobre la base de datos de pubs, en la tabla de titles. Reportará
los cambios realizados.

Create trigger t_uptit


on titles
for update
as
select * from deleted
select * from inserted
Trigger UPDATE
Respetando las restricciones de la tabla la actualización:
update titles
set price = price * 1.15
where price between 19.00 and 20.00

Se presenta todo lo que estaba en titles con precio entre 19 y 20 y por


que valor fue cambiado al ejecutarse el UPDATE
Veamos: BU1032 19.9900 * 1.15 =22.9885
TRIGGER UPDATE
 IF UPDATE (<atributo>)
Se puede preguntar de forma directa si algún atributo esta
siendo modificado, para ello basta con usar la función
UPDATE( ) que retornará un valor Falso o Verdadero.
TRIGGER for
UPDATE
El siguiente ejemplo muestra como al momento de realizar una
actualización sobre una tabla se puede usar if update() para
saber si se esta actualizando o no un campo.

Este ejemplo se realiza sobre la base de datos de pubs, en la tabla


de titles. Reportará que no se puede modificar el atributo price.
alter trigger t_uptit
on titles
for update
as
if update(price) --Si se esta modificando price no se puede modificar
begin
print ‘No se puede modificar el precio'
Rollback transaction-- Reversa la acción
end del update realizado

OBSERVACIÓN: Al ejecutar un Trigger en forma implícita se inicia una


transacción (BEGIN-TRANSSACTION).
TRIGGER for
UPDATE
Respetando las restricciones de la tabla la
actualización:
update titles
set price = price * 1.15
where price between 19.00 and 20.00

‘No se puede
modificar el precio'
EJEMPLO DE CUANDO USAR UN
TRIGGERS INSTEAD OF

1. Empleado hace ANTES de


un pedido insertar el PEDIDO
TRIGGER INSERT Se debe verificar
si hay productos
disponibles para
la cantidad pedida
y si hay
actualizarla
1 2

TABLA PRODUCTO
TABLA_PEDIDO
COD_PROD
COD_PRODUCTO
NOMBRE
CANTIDAD
COSTO
IMPORTE
CANT_DISPONIBLE
TRIGGER INSTEAD OF
 Se pueden crear Instead of triggers con lo que SQL
Server ignora la acción que activó el trigger y realiza
únicamente lo que se indica en el disparador. Si deseo
que se haga la acción (ya sea el insert, delete o el update
por el cual se activó), debo colocar dicha la acción
dentro del trigger.

 Se puede crear un Instead of tanto para inserción como


para actualización o borrado.

 Una vez existente un trigger del tipo Instead of se


ignoran a los tipo After
TRIGGER INSTEAD OF
INSERT
El siguiente ejemplo muestra como al momento de realizar una
inserción sobre una tabla se puede bloquear la acción e indicar que
no se permite tal operación.

Create trigger t_institles


on titles
instead of insert
as
select ‘You cannot insert information in this table'
as Error
select * from inserted

Antes de insertar cualquier dato, ejecuta el trigger.


TRIGGER INSTEAD OF
Create trigger t_institles
on titles
instead of insert
as
select ‘You cannot insert information in this table'
as Error
select * from inserted

insert into titles


values ('BU9865','The power of the rain','psychologic',

1389, 25.26, 5000.000, 10,4095,null,'Sep 22, 2000')


Mantenimiento de Triggers.

Existe una serie de instrucciones que permite el


modificar, borrar o temporalmente deshabilitar un
trigger.

Alter Trigger <nombre> -- Modifica


Drop Trigger <nombre> -- Elimina
Mantenimiento de Triggers.

 Deshabilitando un trigger
Alter Table <nombre_tabla>
Disable Trigger {all | <nombre_trigger>}

 Habilitando un trigger
Alter Table <nombre_tabla>
Enable Trigger {all | <nombre_trigger>}
Se le ha solicitado elaborar un programa que de manera
automática valide al ingresarse un nuevo pedido,
si existe o no la cantidad necesaria de productos para
satisfacer el pedido.
En caso de que no exista cantidad suficiente, deberá enviar un
mensaje al usuario indicando que no hay productos suficientes.
Si existe deberá aceptar el pedido (tabla pedido) y decrementar
la cantidad de productos en la tabla PRODUCTO.

INSERT INTO PEDIDO (ID_PEDIDO, PRODUCTOID, CANTIDAD_PED)


VALUES ('AAA', 2, 3)

Note que se están pidiendo 3


unidades del producto
identificado con productoid =2 y
la tabla solo tiene 2
CREATE TRIGGER NUEVO_PEDIDO
ON PEDIDO
INSTEAD OF INSERT
TRIGGER
AS
DECLARE @CANTIDAD_PEDIDA INT, INSTEAD OF
@ID_PEDIDO CHAR(3),
@PRODUCTOID INT,
@CANTIDAD_EXISTENCIA INT
INSERT
SELECT @ID_PEDIDO = INSERTED.ID_PEDIDO, Paso los datos que se desean insertar a
@CANTIDAD_PEDIDA = INSERTED.CANTIDAD_PED, las variables definidas para tal fin
@PRODUCTOID = INSERTED.PRODUCTOID
FROM INSERTED

SELECT @CANTIDAD_EXISTENCIA = PRODUCTO.Cant_Exist Extraigo de la tabla producto la cantidad


FROM PRODUCTO de existencias que tenemos, del
where PRODUCTO.ID_Producto = @PRODUCTOID producto que se desea pedir
IF (@CANTIDAD_PEDIDA <= @CANTIDAD_EXISTENCIA)
BEGIN
Insert into PEDIDO
Si tengo suficiente cantidad de
values ( @ID_PEDIDO, @PRODUCTOID,@CANTIDAD_PEDIDA)
productos
update PRODUCTO
set CANT_EXIST = @CANTIDAD_EXISTENCIA - @CANTIDAD_PEDIDA
WHERE ID_Producto = @PRODUCTOID
END

ELSE

SELECT 'NO HAY PRODUCTOS SUFICIENTES PARA LA VENTA' Si no tengo productos suficientes
RETURN
ANTES DEL
INSERT

DESPUÉS
DEL INSERT
ANTES DEL
INSERT

TABLA PRODUCTO

TABLA PEDIDO

DESPUÉS TABLA PRODUCTO


DEL INSERT

TABLA PEDIDO
ALTER TRIGGER NUEVO_PEDIDO
ON PEDIDO ALTER AL TRIGGER
INSTEAD OF INSERT
AS
DECLARE @CANTIDAD_PEDIDA INT,
INSTEAD OF CA
MB
@ID_PEDIDO CHAR(3),
@PRODUCTOID INT, INSERT I
FOR AMOS
MA LA
@CANTIDAD_EXISTENCIA INT A
VAL SIGN E D
OR AR
E
VAR S A
SELECT @ID_PEDIDO = INSERTED.ID_PEDIDO,
IAB LAS
@CANTIDAD_PEDIDA =INSERTED.CANTIDAD_PED, LES
@PRODUCTOID = INSERTED.PRODUCTOID,
@CANTIDAD_EXISTENCIA = PRODUCTO.Cant_Exist
FROM INSERTED JOIN PRODUCTO
ON PRODUCTO.ID_Producto = INSERTED.PRODUCTOID

IF (@CANTIDAD_PEDIDA <= @CANTIDAD_EXISTENCIA)


begin

INSERT INTO PEDIDO


VALUES ( @ID_PEDIDO, @PRODUCTOID,CANTIDAD_PEDIDA)

UPDATE PRODUCTO
SET CANT_EXIST = @CANTIDAD_EXISTENCIA - @CANTIDAD_PEDIDA
WHERE ID_Producto = @PRODUCTOID
end
ELSE
SELECT 'NO HAY PRODUCTOS SUFICIENTES PARA LA VENTA'
RETURN
Conclusión

Uno de los objetos más complejos de la base de


datos son los procedimientos almacenados y
particularmente, los triggers.
Su desarrollo y comprensión requieren de tiempo y
facilidad de programación.
El estudio aquí visto, le permite comprender su
manejo y utilización básica.

También podría gustarte