implementación de desencadenadores
DESCRIPTION
Implementación de desencadenadores. Introducción. Introducción a los desencadenadores Definición de desencadenadores Funcionamiento de los desencadenadores Ejemplos de desencadenadores Consideraciones acerca del rendimiento. Introducción a los desencadenadores. ¿Qué es un desencadenador? - PowerPoint PPT PresentationTRANSCRIPT
Implementación de desencadenadores
Introducción
Introducción a los desencadenadores
Definición de desencadenadores
Funcionamiento de los desencadenadores
Ejemplos de desencadenadores
Consideraciones acerca del rendimiento
Introducción a los desencadenadores
¿Qué es un desencadenador?
Uso de los desencadenadores
Consideraciones acerca del uso de desencadenadores
¿Qué es un desencadenador?
Asociación a una tabla
Invocación automática
Imposibilidad de llamada directa
Identificación con una transacción
Uso de los desencadenadores
Cambios en cascada en tablas relacionadas de una base de datos
Exigir una integridad de datos más compleja que una restricción CHECK
Definición de mensajes de error personalizados
Mantenimiento de datos no normalizados
Comparación del estado de los datos antes y después de su modificación
Consideraciones acerca del uso de desencadenadores
Los desencadenadores son reactivos, mientras que las restricciones son proactivas
Las restricciones se comprueban antes
Las tablas pueden tener varios desencadenadores para cualquier acción
Los propietarios de las tablas pueden designar el primer y último desencadenador que se debe activar
Debe tener permiso para ejecutar todas las instrucciones definidas en los desencadenadores
Los propietarios de tablas no pueden crear desencadenadores AFTER en vistas o en tablas temporales
Definición de desencadenadores
Creación de desencadenadores
Alteración y eliminación de desencadenadores
Creación de desencadenadores
Necesidad de los permisos adecuados
Imposibilidad de incluir determinadas instrucciones
Use NorthwindGOCREATE TRIGGER Empl_Delete ON EmployeesFOR DELETE ASIF (SELECT COUNT(*) FROM Deleted) > 1BEGIN RAISERROR( 'You cannot delete more than one employee at a time.', 16, 1) ROLLBACK TRANSACTIONEND
Use NorthwindGOCREATE TRIGGER Empl_Delete ON EmployeesFOR DELETE ASIF (SELECT COUNT(*) FROM Deleted) > 1BEGIN RAISERROR( 'You cannot delete more than one employee at a time.', 16, 1) ROLLBACK TRANSACTIONEND
Alteración y eliminación de desencadenadores
Alteración de un desencadenador Cambios en la definición sin quitar el desencadenador Deshabilitación o habilitación de un desencadenador
Eliminación de un desencadenador
USE NorthwindGOALTER TRIGGER Empl_Delete ON EmployeesFOR DELETE ASIF (SELECT COUNT(*) FROM Deleted) > 6BEGIN RAISERROR( 'You cannot delete more than six employees at a time.', 16, 1) ROLLBACK TRANSACTIONEND
USE NorthwindGOALTER TRIGGER Empl_Delete ON EmployeesFOR DELETE ASIF (SELECT COUNT(*) FROM Deleted) > 6BEGIN RAISERROR( 'You cannot delete more than six employees at a time.', 16, 1) ROLLBACK TRANSACTIONEND
Funcionamiento de los desencadenadores
Funcionamiento de un desencadenador INSERT
Funcionamiento de un desencadenador DELETE
Funcionamiento de un desencadenador UPDATE
Funcionamiento de un desencadenador INSTEAD OF
Funcionamiento de los desencadenadores anidados
Desencadenadores recursivos
Funcionamiento de un desencadenador INSERT
Instrucción INSERT en tabla con desencadenador INSERT
INSERT [Order Details] VALUES(10525, 2, 19.00, 5, 0.2)
INSERT [Order Details] VALUES(10525, 2, 19.00, 5, 0.2)
Order DetailsOrder DetailsOrder DetailsOrder Details
OrderIDOrderID
105221052310524
105221052310524
ProductIDProductID
10417
10417
UnitPriceUnitPrice
31.009.6530.00
31.009.6530.00
QuantityQuantity
7924
7924
DiscountDiscount
0.20.150.0
0.20.150.0
5 19.002 0.210523
Instrucción INSERT registrada
insertedinsertedinsertedinserted
1052310523 22 19.0019.00 55 0.20.2
Ejecución de acciones TRIGGER
Order DetailsOrder DetailsOrder DetailsOrder Details
OrderIDOrderID
105221052310524
105221052310524
ProductIDProductID
10417
10417
UnitPriceUnitPrice
31.009.6530.00
31.009.6530.00
QuantityQuantity
7924
7924
DiscountDiscount
0.20.150.0
0.20.150.0
5 19.002 0.210523
Trigger Code:USE NorthwindCREATE TRIGGER OrdDet_InsertON [Order Details]FOR INSERTASUPDATE P SET UnitsInStock = (P.UnitsInStock – I.Quantity)FROM Products AS P INNER JOIN Inserted AS ION P.ProductID = I.ProductID
Trigger Code:USE NorthwindCREATE TRIGGER OrdDet_InsertON [Order Details]FOR INSERTASUPDATE P SET UnitsInStock = (P.UnitsInStock – I.Quantity)FROM Products AS P INNER JOIN Inserted AS ION P.ProductID = I.ProductID
UPDATE P SET UnitsInStock = (P.UnitsInStock – I.Quantity)FROM Products AS P INNER JOIN Inserted AS ION P.ProductID = I.ProductID
ProductsProductsProductsProducts
ProductIDProductID UnitsInStockUnitsInStock …… ……
1234
1234
15106520
15106520
2 15
Instrucción INSERT en una tabla con undesencadenador INSERT
Instrucción INSERT registrada
Acción del desencadenador ejecutada
1111
2222
3333
Funcionamiento de un desencadenador DELETE
Instrucción DELETE en tabla con desencadenador DELETEInstrucción DELETE en tabla con desencadenador DELETE
DeletedDeletedDeletedDeleted
44 Dairy ProductsDairy Products CheesesCheeses 0x15…0x15…
Instrucción DELETE registrada
CategoriesCategoriesCategoriesCategories
CategoryIDCategoryID
123
123
CategoryNameCategoryName
BeveragesCondimentsConfections
BeveragesCondimentsConfections
DescriptionDescription
Soft drinks, coffees…Sweet and savory …Desserts, candies, …
Soft drinks, coffees…Sweet and savory …Desserts, candies, …
PicturePicture
0x15…0x15…0x15…
0x15…0x15…0x15… 0x15…CheesesDairy Products4
DELETE CategoriesWHERE CategoryID = 4
DELETE CategoriesWHERE CategoryID = 4
USE NorthwindCREATE TRIGGER Category_Delete
ON CategoriesFOR DELETE
ASUPDATE P SET Discontinued = 1FROM Products AS P INNER JOIN deleted AS dON P.CategoryID = d.CategoryID
USE NorthwindCREATE TRIGGER Category_Delete
ON CategoriesFOR DELETE
ASUPDATE P SET Discontinued = 1FROM Products AS P INNER JOIN deleted AS dON P.CategoryID = d.CategoryID
ProductsProductsProductsProducts
ProductIDProductID DiscontinuedDiscontinued …… ……
1234
1234
0000
0000
Acción del desencadenador ejecutada
2 1
UPDATE P SET Discontinued = 1FROM Products AS P INNER JOIN deleted AS dON P.CategoryID = d.CategoryID
Instrucción DELETE en una tabla con un desencadenador DELETE
Instrucción DELETE registrada
Acción del desencadenador ejecutada
1111
2222
3333
Funcionamiento de un desencadenador UPDATE
Instrucción UPDATE para una tabla con un desencadenador UPDATE definido
UPDATE EmployeesSET EmployeeID = 17WHERE EmployeeID = 2
UPDATE EmployeesSET EmployeeID = 17WHERE EmployeeID = 2
Instrucción UPDATE registrada como instrucciones INSERT yDELETE
EmployeesEmployeesEmployeesEmployees
EmployeeIDEmployeeID LastNameLastName FirstNameFirstName TitleTitle HireDateHireDate
1234
1234
DavolioBarrLeverlingPeacock
DavolioBarrLeverlingPeacock
NancyAndrewJanetMargaret
NancyAndrewJanetMargaret
Sales Rep.RSales Rep.Sales Rep.
Sales Rep.RSales Rep.Sales Rep.
~~~~~~~~~~~~
~~~~~~~~~~~~
2 Fuller Andrew Vice Pres. ~~~
insertinsertadaadainsertinsertadaada
1717 FullerFuller AndrewAndrew Vice Pres.Vice Pres. ~~~~~~
eliminadaeliminadaeliminadaeliminada
22 FullerFuller AndrewAndrew Vice Pres.Vice Pres. ~~~~~~
Ejecución de acciones TRIGGER
USE NorthwindGOCREATE TRIGGER Employee_Update
ON EmployeesFOR UPDATE
ASIF UPDATE (EmployeeID)BEGIN TRANSACTION
RAISERROR ('Transaction cannot be processed.\***** Employee ID number cannot be modified.', 10, 1)ROLLBACK TRANSACTION
USE NorthwindGOCREATE TRIGGER Employee_Update
ON EmployeesFOR UPDATE
ASIF UPDATE (EmployeeID)BEGIN TRANSACTION
RAISERROR ('Transaction cannot be processed.\***** Employee ID number cannot be modified.', 10, 1)ROLLBACK TRANSACTION
ASIF UPDATE (EmployeeID)BEGIN TRANSACTIONRAISERROR ('Transaction cannot be processed.\***** Employee ID number cannot be modified.', 10, 1)ROLLBACK TRANSACTION
No se puede procesar la transacción. ***** No se puede modificar el número de miembro No se puede procesar la transacción. ***** No se puede modificar el número de miembro
EmployeesEmployeesEmployeesEmployees
EmployeeIDEmployeeID LastNameLastName FirstNameFirstName TitleTitle HireDateHireDate
1234
1234
DavolioBarrLeverlingPeacock
DavolioBarrLeverlingPeacock
NancyAndrewJanetMargaret
NancyAndrewJanetMargaret
Sales Rep.RSales Rep.Sales Rep.
Sales Rep.RSales Rep.Sales Rep.
~~~~~~~~~~~~
~~~~~~~~~~~~
2 Fuller Andrew Vice Pres. ~~~
Instrucción UPDATE en una tabla con undesencadenador UPDATE
Instrucción UPDATE registrada como instruccionesINSERT y DELETE
Acción del desencadenador ejecutada
1111
2222
3333
Funcionamiento de un desencadenador INSTEAD OF
Crea una vista que combina dos o más tablas
CREATE VIEW Customers ASSELECT * FROM CustomersMexUNIONSELECT * FROM CustomersGer
CREATE VIEW Customers ASSELECT * FROM CustomersMexUNIONSELECT * FROM CustomersGer
CustomersMexCustomersMexCustomersMexCustomersMex
CustomerIDCustomerID CompanyNameCompanyName CountryCountry PhonePhone ……
ANATRANTONCENTC
ANATRANTONCENTC
Ana Trujill…Antonio M…Centro Co…
Ana Trujill…Antonio M…Centro Co…
MexicoMexicoMexico
MexicoMexicoMexico
(5) 555-4729(5) 555-3932(5) 555-3392
(5) 555-4729(5) 555-3932(5) 555-3392
~~~~~~~~~
~~~~~~~~~
CustomersGerCustomersGerCustomersGerCustomersGer
CustomerIDCustomerID CompanyNameCompanyName CountryCountry PhonePhone ……
ALFKIBLAUSDRACD
ALFKIBLAUSDRACD
Alfreds Fu…Blauer Se…Drachenb…
Alfreds Fu…Blauer Se…Drachenb…
GermanyGermanyGermany
GermanyGermanyGermany
030-00743210621-084600241-039123
030-00743210621-084600241-039123
~~~~~~~~~
~~~~~~~~~
El desencadenador INSTEAD OF dirige la actualización a la tabla base
CustomersCustomersCustomersCustomers
CustomerIDCustomerID CompanyNameCompanyName CountryCountry PhonePhone ……
ALFKIANATRANTON
ALFKIANATRANTON
Alfreds Fu…Ana Trujill…Antonio M…
Alfreds Fu…Ana Trujill…Antonio M…
GermanyMexicoMexico
GermanyMexicoMexico
030-0074321(5) 555-4729(5) 555-3932
030-0074321(5) 555-4729(5) 555-3932
~~~~~~~~~
~~~~~~~~~
La inserción original a la vista Customers no se produce
Se ejecuta UPDATE en la vista
ALFKI Alfreds Fu… Germany 030-0074321 ~~~
ALFKI Alfreds Fu… Germany 030-0074321 ~~~
El desencadenador INSTEAD OF puede estar enuna tabla o vista
La acción que inicia el desencadenador no seproduce
Permite actualizaciones en vistas que no se hanactualizado previamente
1111
2222
3333
Funcionamiento de los desencadenadores anidados
2 15
UnitsInStock + UnitsOnOrder es < ReorderLevel para ProductID 2
OrDe_UpdateOrDe_Update
La realización de un pedido provoca la ejecución del desencadenador OrDe_Update
Se ejecuta la instrucción UPDATE en la tabla Products
InStock_UpdateInStock_Update ProductsProductsProductsProducts
ProductIDProductID UnitsInStockUnitsInStock …… ……
1
34
1
34
15156520
15156520
Se ejecuta el desencadenador InStock_Update
Envía un mensaje
Order_DetailsOrder_DetailsOrder_DetailsOrder_Details
OrderIDOrderID
105221052310524
105221052310524
ProductIDProductID
10417
10417
UnitPriceUnitPrice
31.009.6530.00
31.009.6530.00
QuantityQuantity
7924
7924
DiscountDiscount
0.20.150.0
0.20.150.0
10525 19.002 0.25
2 15
Desencadenadores recursivos
Activación recursiva de un desencadenador Tipos de desencadenadores recursivos
Recursividad directa, que se da cuando un desencadenador se ejecuta y realiza una acción que lo activa de nuevo
Recursividad indirecta, que se da cuando un desencadenador se activa y realiza una acción que activa un desencadenador de otra tabla
Conveniencia del uso de los desencadenadores recursivos
Ejemplos de desencadenadores
Exigir la integridad de los datos
Exigir reglas de empresa
Exigir la integridad de los datos
CREATE TRIGGER BackOrderList_DeleteON Products FOR UPDATE
ASIF (SELECT BO.ProductID FROM BackOrders AS BO JOIN
Inserted AS I ON BO.ProductID = I.Product_ID) > 0
BEGINDELETE BO FROM BackOrders AS BO INNER JOIN Inserted AS I ON BO.ProductID = I.ProductID
END
CREATE TRIGGER BackOrderList_DeleteON Products FOR UPDATE
ASIF (SELECT BO.ProductID FROM BackOrders AS BO JOIN
Inserted AS I ON BO.ProductID = I.Product_ID) > 0
BEGINDELETE BO FROM BackOrders AS BO INNER JOIN Inserted AS I ON BO.ProductID = I.ProductID
END
ProductsProductsProductsProducts
ProductIDProductID UnitsInStockUnitsInStock …… ……
1
34
1
34
15106520
15106520
2 15 ActualizadaActualizada
BackOrdersBackOrdersBackOrdersBackOrders
ProductIDProductID UnitsOnOrderUnitsOnOrder ……
1123
1123
151065
151065
2 15 El desencadenadorelimina la fila
El desencadenadorelimina la fila
ProductsProductsProductsProducts
ProductIDProductID UnitsInStockUnitsInStock …… ……
1234
1234
15106520
15106520
Exigir reglas de empresa
Los productos con pedidos pendientes no se pueden eliminar
IF (Select Count (*) FROM [Order Details] INNER JOIN deleted ON [Order Details].ProductID = deleted.ProductID ) > 0ROLLBACK TRANSACTION
IF (Select Count (*) FROM [Order Details] INNER JOIN deleted ON [Order Details].ProductID = deleted.ProductID ) > 0ROLLBACK TRANSACTION
La instrucción DELETE se ejecuta en la tabla Product
El código del desencadenadorcomprueba la tabla Order Details
Order DetailsOrder DetailsOrder DetailsOrder Details
OrderIDOrderID
10522105231052410525
10522105231052410525
ProductIDProductID
102417
102417
UnitPriceUnitPrice
31.0019.009.6530.00
31.0019.009.6530.00
QuantityQuantity
7924
7924
DiscountDiscount
0.20.150.0
0.20.150.0
9
'No puede procesarse la transacción''Este producto tiene historial de pedidos'
'No puede procesarse la transacción''Este producto tiene historial de pedidos'
Se deshacela transacción
ProductsProductsProductsProducts
ProductIDProductID UnitsInStockUnitsInStock …… ……
1
34
1
34
15106520
15106520
2 0
Consideraciones acerca del rendimiento
Los desencadenadores trabajan rápidamente porque las tablas insertadas y eliminadas están en la caché
El tiempo de ejecución está determinado por:
Número de tablas a las que se hace referencia
Número de filas afectadas
Las acciones contenidas en un desencadenador forman parte de una transacción