Documente Academic
Documente Profesional
Documente Cultură
Desencadenadores
Concepto
Controlar los datos
no permitir eliminar un cliente si tiene pedidos
solucin: relacin de clave externa
Tipos de desencadenadores
INSERT UPDATE DELETE INSTEAD OF
Introduccin
un desencadenador es una serie de instrucciones Sql muy similar al procedimiento almacenado
a un desencadenador NO se le puede llamar con EXEC los desencadenadores se activan cuando un usuario ejecuta una instruccin Transact-SQL
Tipos
los desencadenadores del lenguaje de manipulacin de datos (DML) se activan con instrucciones
INSERT UPDATE DELETE
Ejemplo
desencadenador para INSERT
no puede insertar un cliente extranjero cuando usuario inserta un nuevo cliente
desencadenador INSERT
ejecuta determina si cumple criterio del desencadenador cumple completa insert
Desencadenadores INSERT
se puede usar para modificar o impedir un registro que se est insertando
impedir insertar un cliente de tal ciudad o con un descuento superior a tanto aadir datos al registro que se inserta aadir cambios en cascadas en otras tablas
insertar un registro en tabla de usuarios y adems en la tabla de contactos
Se activan cuando se intenta crear un nuevo registro en una tabla con el comando INSERT
Sql copia el nuevo registro en una tabla de desencadenadores y tb en otra tabla especial almacenada en memoria llamada inserted
el nuevo registro existe en dos tablas
desencadenadores inserted ambos deben coincidir
Tabla inserted
fundamental para hacer cambios en cascada
cuando se venda algo
debemos restar de unidades en stock permite entonces mantener el inventario actualizado
Solucin
almacenar cantidad vendida en una variable de memoria y actualizar tabla con UPDATE
requiere ms codigo ralentiza el sistema
UPDATE tabla1 SET tabla1.existencias= (tabla1.existencias tabla2.unidadesvendidas) FROM tabla1 JOIN tabla2 ON tabla1.id=tabla2.id
Crear desencadenador
Explorador objetos Bases de Datos Tablas Tabla elegida carpeta Desencadenadores
boton derecho nuevo desencadenador se abre una plantilla
Desencadenador
CREATE TRIGGER dbo.nombreDesencadenador ON dbo.NombreTabla AFTER INSERT AS BEGIN No retorna el mensaje de cantidad de registros afectados SET NOCOUNT ON UPDATE p SET p.unidadesenstock = (p.unidadesenstock q.unidadesvendidas) FROM Productos p JOIN Ventas q ON p.id=q.id END GO
clic en ejecutar para crear el desencadenador ya hemos creado el desencadenador INSERT en la tabla
Comprobamos
haces otra consulta
SELECT * FROM Tabla
ha cambiado la cantidad???
Desencadenadores DELETE
usados para restringuir los datos que los usuarios pueden eliminar de una BD
no eliminar comunicar su eliminacin
CREATE TRIGGER dbo.nombreDesencadenador ON dbo.NombreTabla AFTER DELETE AS BEGIN No retorna el mensaje de cantidad de registros afectados SET NOCOUNT ON IF (SELECT ciudad FROM deleted) = Madrid BEGIN PRINT no se puede eliminar PRINT la transaccion ha sido cancelada ROLLBACK END END GO
Desencadenadores UPDATE
permiten restringir instrucciones UPDATE emitidas por los usuarios
intercepta modificaciones de datos y las verifica utiliza una combinacin de los mtodos usados por los desencadenadores INSERT y DELETE
el desencadenador UPDATE utiliza las dos tablas
inserted deleted
Podemos crear un desencadenador que compruebe las unidades en Stock de una tabla
Carpeta desencadenadores boton derecho nuevo
CREATE TRIGGER dbo.nombreDesencadenador ON dbo.NombreTabla AFTER UPDATE AS BEGIN No retorna el mensaje de cantidad de registros afectados SET NOCOUNT ON IF (SELECT existencias FROM inserted) < 0 BEGIN PRINT no se puede actualizar PRINT la transaccion ha sido cancelada ROLLBACK END END GO
Desencadenador IF UPDATE
este desencadenador rechaza cambios en un campo
imagina un campo que no puede cambiar
CREATE TRIGGER dbo.nombreDesencadenador ON dbo.NombreTabla AFTER UPDATE AS BEGIN No retorna el mensaje de cantidad de registros afectados SET NOCOUNT ON IF UPDATE (campo) BEGIN PRINT no se puede actualizar PRINT la transaccion ha sido cancelada ROLLBACK END END GO
Desencadenadores INSTEAD OF
este desencadenador es el responsable de insertar o eliminar nuevos registros. si insertas registros en una tabla
debes incluir todos los registros obligatorios piensa en una vista que no muestre todos los campos
error al insertar
intentamos insertar un nuevo registro en la vista INSERT nombrevista VALUES (dato1, dato2, .)
CREATE TRIGGER dbo.nombreDesencadenador ON dbo.NombreVista INSTEAD OF INSERT AS BEGIN No retorna el mensaje de cantidad de registros afectados SET NOCOUNT ON DECLARE @PARAMETRO1 VARCHAR(20), @PARAMETRO2 CHAR(5), SET @CIUDAD=Madrid, SET @PARAMETRO1 = (SELECT CAMPO1 FROM INSERTED), INSERT Customers VALUES (@PARAMETRO1, @PARAMETRO2, @CIUDAD.) END GO
Ejecuta el desencadenador para crearlo ahora vuelves a repetir el codigo de INSERT en la vista da error?
Avanzado
Combinar desencadenadores para facilitar administracin usar RAISERROR() en lugar de PRINT() desencadenadores recursvios
desencadenador de una tabla realiza una accin que activa el desencadenador de otra tabla
Combinar desencadenadores
nos aseguramos que nadie pueda insertar, actualizar o eliminar registros excepto la administracin No necesitamos crear tres desencadenadores distintos
los combinamos de dos en dos o tres
CREATE TRIGGER dbo.nombreDesencadenador ON dbo.NombreTabla AFTER DELETE, UPDATE AS BEGIN No retorna el mensaje de cantidad de registros afectados SET NOCOUNT ON IF (SELECT nombre FROM deleted) =juan BEGIN PRINT no se puede eliminar PRINT la transaccion ha sido cancelada ROLLBACK END END GO
Ejecuta el desencadenador para crearlo ahora intenta eliminar a juan DELETE FROM Customers WHERE nombre=juan debe saltar error
ahora igual con UPDATE UPDATE Customers SET nombre=maria WHERE nombre=juan tb debe saltar error
severity
gravedad de error de 1 a 25 (el ms grave) 10 es informativo
state
si se genera en ms de un lugar del desencadenador en comienzo 1, en medio 2.
ALTER TRIGGER dbo.nombreDesencadenador ON dbo.NombreTabla AFTER DELETE, UPDATE AS BEGIN No retorna el mensaje de cantidad de registros afectados SET NOCOUNT ON IF (SELECT nombre FROM deleted) =juan BEGIN RAISERROR (no se puede eliminar, 10,1) ROLLBACK END END GO
Desencadenadores recursivos
Podemos tener desencadenadores en cada tabla de datos
un desencadenador que actualiza otras tablas puede activar desencadenadores de esas tablas
en la tabla Productos
desencadenador UPDATE para asegurarse que la cantidad no es menor que cero
No funciona
proteccin
desencadenadores recursivos estn deshabilitados por defecto
Bases de datos boton derecho Propiedades pagina Opciones Desencadenadores recursivos habilitados en True
consulta nueva
INSERT Pedidos VALUES (1, 3, 5, getDate())
Desencadenores DDL
Data Definition Language los DDL NO se activan con eventos de
INSERT, UPDATE Y DELETE
sino
CREATE, ALTER Y DROP
instruccin que modifica la estructura de datos