Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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
• 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
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
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)
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
‘No se puede
modificar el precio'
EJEMPLO DE CUANDO USAR UN
TRIGGERS INSTEAD OF
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.
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.
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
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
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