La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Implementación de desencadenadores. Introducción Introducción a los desencadenadores Definición de desencadenadores Funcionamiento de los desencadenadores.

Presentaciones similares


Presentación del tema: "Implementación de desencadenadores. Introducción Introducción a los desencadenadores Definición de desencadenadores Funcionamiento de los desencadenadores."— Transcripción de la presentación:

1 Implementación de desencadenadores

2 Introducción Introducción a los desencadenadores Definición de desencadenadores Funcionamiento de los desencadenadores Ejemplos de desencadenadores Consideraciones acerca del rendimiento

3 Introducción a los desencadenadores ¿Qué es un desencadenador? Uso de los desencadenadores Consideraciones acerca del uso de desencadenadores

4 ¿Qué es un desencadenador? Asociación a una tabla Invocación automática Imposibilidad de llamada directa Identificación con una transacción

5 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

6 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

7 Definición de desencadenadores Creación de desencadenadores Alteración y eliminación de desencadenadores

8 Creación de desencadenadores Necesidad de los permisos adecuados Imposibilidad de incluir determinadas instrucciones Use Northwind GO CREATE TRIGGER Empl_Delete ON Employees FOR DELETE AS IF (SELECT COUNT(*) FROM Deleted) > 1 BEGIN RAISERROR( 'You cannot delete more than one employee at a time.', 16, 1) ROLLBACK TRANSACTION END Use Northwind GO CREATE TRIGGER Empl_Delete ON Employees FOR DELETE AS IF (SELECT COUNT(*) FROM Deleted) > 1 BEGIN RAISERROR( 'You cannot delete more than one employee at a time.', 16, 1) ROLLBACK TRANSACTION END

9 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 Northwind GO ALTER TRIGGER Empl_Delete ON Employees FOR DELETE AS IF (SELECT COUNT(*) FROM Deleted) > 6 BEGIN RAISERROR( 'You cannot delete more than six employees at a time.', 16, 1) ROLLBACK TRANSACTION END USE Northwind GO ALTER TRIGGER Empl_Delete ON Employees FOR DELETE AS IF (SELECT COUNT(*) FROM Deleted) > 6 BEGIN RAISERROR( 'You cannot delete more than six employees at a time.', 16, 1) ROLLBACK TRANSACTION END

10 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

11 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 Details OrderID ProductID UnitPrice Quantity Discount Instrucción INSERT registrada insertedinserted Ejecución de acciones TRIGGER Order Details OrderID ProductID UnitPrice Quantity Discount Trigger Code: USE Northwind CREATE TRIGGER OrdDet_Insert ON [Order Details] FOR INSERT AS UPDATE P SET UnitsInStock = (P.UnitsInStock – I.Quantity) FROM Products AS P INNER JOIN Inserted AS I ON P.ProductID = I.ProductID Trigger Code: USE Northwind CREATE TRIGGER OrdDet_Insert ON [Order Details] FOR INSERT AS UPDATE P SET UnitsInStock = (P.UnitsInStock – I.Quantity) FROM Products AS P INNER JOIN Inserted AS I ON P.ProductID = I.ProductID UPDATE P SET UnitsInStock = (P.UnitsInStock – I.Quantity) FROM Products AS P INNER JOIN Inserted AS I ON P.ProductID = I.ProductIDProductsProducts ProductID UnitsInStock … … … … Instrucción INSERT en una tabla con un desencadenador INSERT Instrucción INSERT registrada Acción del desencadenador ejecutada

12 Funcionamiento de un desencadenador DELETE Instrucción DELETE en tabla con desencadenador DELETE DeletedDeleted 4 4 Dairy Products Cheeses 0x15… Instrucción DELETE registrada CategoriesCategories CategoryID CategoryName Beverages Condiments Confections Beverages Condiments Confections Description Soft drinks, coffees… Sweet and savory … Desserts, candies, … Soft drinks, coffees… Sweet and savory … Desserts, candies, … Picture 0x15… 0x15…0x15… CheesesDairy Products4 DELETE Categories WHERE CategoryID = 4 DELETE Categories WHERE CategoryID = 4 USE Northwind CREATE TRIGGER Category_Delete ON Categories FOR DELETE AS UPDATE P SET Discontinued = 1 FROM Products AS P INNER JOIN deleted AS d ON P.CategoryID = d.CategoryID USE Northwind CREATE TRIGGER Category_Delete ON Categories FOR DELETE AS UPDATE P SET Discontinued = 1 FROM Products AS P INNER JOIN deleted AS d ON P.CategoryID = d.CategoryID ProductsProducts ProductID Discontinued … … … … Acción del desencadenador ejecutada 21 UPDATE P SET Discontinued = 1 FROM Products AS P INNER JOIN deleted AS d ON P.CategoryID = d.CategoryID Instrucción DELETE en una tabla con un desencadenador DELETE Instrucción DELETE registrada Acción del desencadenador ejecutada

13 Funcionamiento de un desencadenador UPDATE Instrucción UPDATE para una tabla con un desencadenador UPDATE definido UPDATE Employees SET EmployeeID = 17 WHERE EmployeeID = 2 UPDATE Employees SET EmployeeID = 17 WHERE EmployeeID = 2 Instrucción UPDATE registrada como instrucciones INSERT y DELETEEmployeesEmployees EmployeeID LastName FirstName Title HireDate Davolio Barr Leverling Peacock Davolio Barr Leverling Peacock Nancy Andrew Janet Margaret Nancy Andrew Janet Margaret Sales Rep. R Sales Rep. R Sales Rep. ~~~ 2FullerAndrewVice Pres. ~~~ insertada 17 Fuller Andrew Vice Pres. ~~~ eliminadaeliminada 2 2 Fuller Andrew Vice Pres. ~~~ Ejecución de acciones TRIGGER USE Northwind GO CREATE TRIGGER Employee_Update ON Employees FOR UPDATE AS IF UPDATE (EmployeeID) BEGIN TRANSACTION RAISERROR ('Transaction cannot be processed.\ ***** Employee ID number cannot be modified.', 10, 1) ROLLBACK TRANSACTION USE Northwind GO CREATE TRIGGER Employee_Update ON Employees FOR UPDATE AS IF UPDATE (EmployeeID) BEGIN TRANSACTION RAISERROR ('Transaction cannot be processed.\ ***** Employee ID number cannot be modified.', 10, 1) ROLLBACK TRANSACTION AS IF UPDATE (EmployeeID) BEGIN TRANSACTION RAISERROR ('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 EmployeesEmployees EmployeeID LastName FirstName Title HireDate Davolio Barr Leverling Peacock Davolio Barr Leverling Peacock Nancy Andrew Janet Margaret Nancy Andrew Janet Margaret Sales Rep. R Sales Rep. R Sales Rep. ~~~ 2FullerAndrewVice Pres. ~~~ Instrucción UPDATE en una tabla con un desencadenador UPDATE Instrucción UPDATE registrada como instrucciones INSERT y DELETE Acción del desencadenador ejecutada

14 Funcionamiento de un desencadenador INSTEAD OF Crea una vista que combina dos o más tablas CREATE VIEW Customers AS SELECT * FROM CustomersMex UNION SELECT * FROM CustomersGer CREATE VIEW Customers AS SELECT * FROM CustomersMex UNION SELECT * FROM CustomersGerCustomersMexCustomersMex CustomerID CompanyName Country Phone … … ANATR ANTON CENTC ANATR ANTON CENTC Ana Trujill… Antonio M… Centro Co… Ana Trujill… Antonio M… Centro Co… Mexico (5) (5) (5) (5) (5) (5) ~~~ CustomersGerCustomersGer CustomerID CompanyName Country Phone … … ALFKI BLAUS DRACD ALFKI BLAUS DRACD Alfreds Fu… Blauer Se… Drachenb… Alfreds Fu… Blauer Se… Drachenb…Germany GermanyGermany ~~~ El desencadenador INSTEAD OF dirige la actualización a la tabla baseCustomersCustomers CustomerID CompanyName Country Phone … … ALFKI ANATR ANTON ALFKI ANATR ANTON Alfreds Fu… Ana Trujill… Antonio M… Alfreds Fu… Ana Trujill… Antonio M… Germany Mexico Mexico Germany Mexico Mexico (5) (5) (5) (5) ~~~ La inserción original a la vista Customers no se produce Se ejecuta UPDATE en la vista ALFKI Alfreds Fu…Germany ~~~ALFKI Alfreds Fu…Germany ~~~ El desencadenador INSTEAD OF puede estar en una tabla o vista La acción que inicia el desencadenador no se produce Permite actualizaciones en vistas que no se han actualizado previamente

15 Funcionamiento de los desencadenadores anidados 215 UnitsInStock + UnitsOnOrder es < ReorderLevel para ProductID 2 OrDe_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_Update ProductsProducts ProductID UnitsInStock … … … … Se ejecuta el desencadenador InStock_Update Envía un mensajeOrder_DetailsOrder_Details OrderID ProductID UnitPrice Quantity Discount

16 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

17 Ejemplos de desencadenadores Exigir la integridad de los datos Exigir reglas de empresa

18 Exigir la integridad de los datos CREATE TRIGGER BackOrderList_Delete ON Products FOR UPDATE AS IF (SELECT BO.ProductID FROM BackOrders AS BO JOIN Inserted AS I ON BO.ProductID = I.Product_ID ) > 0 BEGIN DELETE BO FROM BackOrders AS BO INNER JOIN Inserted AS I ON BO.ProductID = I.ProductID END ProductsProducts ProductID UnitsInStock … … … … Actualizada BackOrdersBackOrders ProductID UnitsOnOrder … … El desencadenador elimina la fila

19 ProductsProducts ProductID UnitsInStock … … … … 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 ) > 0 ROLLBACK TRANSACTION IF (Select Count (*) FROM [Order Details] INNER JOIN deleted ON [Order Details].ProductID = deleted.ProductID ) > 0 ROLLBACK TRANSACTION La instrucción DELETE se ejecuta en la tabla Product El código del desencadenador comprueba la tabla Order Details Order Details OrderID ProductID UnitPrice Quantity Discount ' 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 deshace la transacciónProductsProducts ProductID UnitsInStock … … … …

20 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


Descargar ppt "Implementación de desencadenadores. Introducción Introducción a los desencadenadores Definición de desencadenadores Funcionamiento de los desencadenadores."

Presentaciones similares


Anuncios Google