implementación de desencadenadores

20
Implementación de desencadenadores

Upload: iola-herring

Post on 30-Dec-2015

34 views

Category:

Documents


0 download

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 Presentation

TRANSCRIPT

Page 1: Implementación de desencadenadores

Implementación de desencadenadores

Page 2: 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

Page 3: Implementación de desencadenadores

Introducción a los desencadenadores

¿Qué es un desencadenador?

Uso de los desencadenadores

Consideraciones acerca del uso de desencadenadores

Page 4: Implementación 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

Page 5: Implementación de desencadenadores

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

Page 6: Implementación de desencadenadores

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

Page 7: Implementación de desencadenadores

Definición de desencadenadores

Creación de desencadenadores

Alteración y eliminación de desencadenadores

Page 8: Implementació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

Page 9: Implementación de desencadenadores

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

Page 10: Implementación de desencadenadores

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

Page 11: Implementación de desencadenadores

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

Page 12: Implementación de desencadenadores

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

Page 13: Implementación de desencadenadores

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

Page 14: Implementación de desencadenadores

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

Page 15: Implementación de desencadenadores

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

Page 16: Implementación de desencadenadores

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

Page 17: Implementación de desencadenadores

Ejemplos de desencadenadores

Exigir la integridad de los datos

Exigir reglas de empresa

Page 18: Implementación de desencadenadores

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

Page 19: Implementación de desencadenadores

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

Page 20: Implementación de desencadenadores

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