La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Implementación de desencadenadores

Presentaciones similares


Presentación del tema: "Implementación de 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

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

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
Ejecución de acciones TRIGGER Order Details OrderID 10522 10523 10524 ProductID 10 41 7 UnitPrice 31.00 9.65 30.00 Quantity 7 9 24 Discount 0.0 5 19.00 2 0.2 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 Instrucción INSERT en una tabla con un desencadenador INSERT Instrucción INSERT registrada Acción del desencadenador ejecutada 1 2 3 Instrucción INSERT en tabla con desencadenador INSERT INSERT [Order Details] VALUES (10525, 2, 19.00, 5, 0.2) Order Details OrderID ProductID UnitPrice Quantity Discount UPDATE P SET UnitsInStock = (P.UnitsInStock – I.Quantity) FROM Products AS P INNER JOIN Inserted AS I ON P.ProductID = I.ProductID 10522 10523 10524 10 41 7 31.00 9.65 30.00 7 9 24 0.0 5 19.00 2 0.2 10523 Products ProductID UnitsInStock 1 2 3 4 15 Instrucción INSERT registrada inserted 10523 2 19.00 5 0.2 2 15

12 Funcionamiento de un desencadenador DELETE
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 Products ProductID Discontinued 1 2 3 4 0 0 0 Acción del desencadenador ejecutada Instrucción DELETE en una tabla con un desencadenador DELETE Instrucción DELETE registrada Acción del desencadenador ejecutada 1 2 3 Instrucción DELETE en tabla con desencadenador DELETE Instrucción DELETE en tabla con desencadenador DELETE Categories CategoryID 1 2 3 CategoryName Beverages Condiments Confections Description Soft drinks, coffees… Sweet and savory … Desserts, candies, … Picture 0x15… 0x15… 0x15… Cheeses Dairy Products 4 DELETE Categories WHERE CategoryID = 4 2 1 UPDATE P SET Discontinued = 1 FROM Products AS P INNER JOIN deleted AS d ON P.CategoryID = d.CategoryID Deleted 4 Dairy Products Cheeses 0x15… Instrucción DELETE registrada

13 Funcionamiento de un desencadenador UPDATE
Instrucción UPDATE en una tabla con un desencadenador UPDATE Instrucción UPDATE registrada como instrucciones INSERT y DELETE Acción del desencadenador ejecutada 1 2 3 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 No se puede procesar la transacción. ***** No se puede modificar el número de miembro Employees EmployeeID LastName FirstName Title HireDate 1 2 3 4 Davolio Barr Leverling Peacock Nancy Andrew Janet Margaret Sales Rep. R ~~~ Fuller Vice Pres. Instrucción UPDATE para una tabla con un desencadenador UPDATE definido UPDATE Employees SET EmployeeID = 17 WHERE EmployeeID = 2 Employees EmployeeID LastName FirstName Title HireDate 1 2 3 4 Davolio Barr Leverling Peacock Nancy Andrew Janet Margaret Sales Rep. R ~~~ Fuller Vice Pres. Instrucción UPDATE registrada como instrucciones INSERT y DELETE insertada 17 Fuller Andrew Vice Pres. ~~~ eliminada 2 Fuller Andrew Vice Pres. ~~~

14 Funcionamiento de un desencadenador INSTEAD OF
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 1 2 3 Crea una vista que combina dos o más tablas CREATE VIEW Customers AS SELECT * FROM CustomersMex UNION SELECT * FROM CustomersGer Se ejecuta UPDATE en la vista Customers CustomerID CompanyName Country Phone ALFKI ANATR ANTON Alfreds Fu… Ana Trujill… Antonio M… Germany Mexico Mexico (5) (5) ~~~ El desencadenador INSTEAD OF dirige la actualización a la tabla base ALFKI Alfreds Fu… Germany ~~~ La inserción original a la vista Customers no se produce CustomersMex CustomerID CompanyName Country Phone ANATR ANTON CENTC Ana Trujill… Antonio M… Centro Co… Mexico (5) (5) (5) ~~~ CustomersGer CustomerID CompanyName Country Phone ALFKI BLAUS DRACD Alfreds Fu… Blauer Se… Drachenb… Germany Germany Germany ~~~ ALFKI Alfreds Fu… Germany ~~~

15 Funcionamiento de los desencadenadores anidados
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 Products ProductID UnitsInStock 1 3 4 15 Se ejecuta el desencadenador InStock_Update Envía un mensaje Order_Details OrderID 10522 10523 10524 10 41 7 UnitPrice 31.00 9.65 30.00 Quantity 7 9 24 Discount 0.0 10525 19.00 2 0.2 5 2 2 15 15

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 Products BackOrders ProductID UnitsInStock ProductID UnitsOnOrder 1 3 4 15 1 12 3 15 10 65 Actualizada 2 15 El desencadenador elimina la fila 2 15

19 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 Se deshace la transacción La instrucción DELETE se ejecuta en la tabla Product El código del desencadenador comprueba la tabla Order Details Products ProductID UnitsInStock 1 3 4 15 2 Products ProductID UnitsInStock 1 2 3 4 15 Order Details OrderID 10522 10523 10524 10525 ProductID 10 2 41 7 UnitPrice 31.00 19.00 9.65 30.00 Quantity 7 9 24 Discount 0.0 9 'No puede procesarse la transacción' 'Este producto tiene historial de pedidos'

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"

Presentaciones similares


Anuncios Google