20
Implementación de desencadenadores

Implementación de desencadenadores€¦ · Introducción a los desencadenadores ... (10525, 2, 19.00, 5, 0.2) Order Details OrderID 10522 10523 10524 ProductID 10 41 7 UnitPrice

  • Upload
    others

  • View
    6

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Implementación de desencadenadores€¦ · Introducción a los desencadenadores ... (10525, 2, 19.00, 5, 0.2) Order Details OrderID 10522 10523 10524 ProductID 10 41 7 UnitPrice

Implementación de

desencadenadores

Page 2: Implementación de desencadenadores€¦ · Introducción a los desencadenadores ... (10525, 2, 19.00, 5, 0.2) Order Details OrderID 10522 10523 10524 ProductID 10 41 7 UnitPrice

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 ... (10525, 2, 19.00, 5, 0.2) Order Details OrderID 10522 10523 10524 ProductID 10 41 7 UnitPrice

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€¦ · Introducción a los desencadenadores ... (10525, 2, 19.00, 5, 0.2) Order Details OrderID 10522 10523 10524 ProductID 10 41 7 UnitPrice

¿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€¦ · Introducción a los desencadenadores ... (10525, 2, 19.00, 5, 0.2) Order Details OrderID 10522 10523 10524 ProductID 10 41 7 UnitPrice

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€¦ · Introducción a los desencadenadores ... (10525, 2, 19.00, 5, 0.2) Order Details OrderID 10522 10523 10524 ProductID 10 41 7 UnitPrice

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€¦ · Introducción a los desencadenadores ... (10525, 2, 19.00, 5, 0.2) Order Details OrderID 10522 10523 10524 ProductID 10 41 7 UnitPrice

Definición de desencadenadores

Creación de desencadenadores

Alteración y eliminación de desencadenadores

Page 8: Implementación de desencadenadores€¦ · Introducción a los desencadenadores ... (10525, 2, 19.00, 5, 0.2) Order Details OrderID 10522 10523 10524 ProductID 10 41 7 UnitPrice

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

Page 9: Implementación de desencadenadores€¦ · Introducción a los desencadenadores ... (10525, 2, 19.00, 5, 0.2) Order Details OrderID 10522 10523 10524 ProductID 10 41 7 UnitPrice

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

Page 10: Implementación de desencadenadores€¦ · Introducción a los desencadenadores ... (10525, 2, 19.00, 5, 0.2) Order Details OrderID 10522 10523 10524 ProductID 10 41 7 UnitPrice

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€¦ · Introducción a los desencadenadores ... (10525, 2, 19.00, 5, 0.2) Order Details OrderID 10522 10523 10524 ProductID 10 41 7 UnitPrice

Funcionamiento de un desencadenador INSERT

Instrucción INSERT en tabla con desencadenador INSERT

INSERT [Order Details] VALUES

(10525, 2, 19.00, 5, 0.2)

Order Details

OrderID

10522

10523

10524

ProductID

10

41

7

UnitPrice

31.00

9.65

30.00

Quantity

7

9

24

Discount

0.2

0.15

0.0

519.002 0.210523

Instrucción INSERT registrada

inserted

10523 2 19.00 5 0.2

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.2

0.15

0.0

519.002 0.210523

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.ProductID

Products

ProductID UnitsInStock … …

1

2

3

4

15

10

65

20

2 15

Instrucción INSERT en una tabla con un

desencadenador INSERT

Instrucción INSERT registrada

Acción del desencadenador ejecutada

1

2

3

Page 12: Implementación de desencadenadores€¦ · Introducción a los desencadenadores ... (10525, 2, 19.00, 5, 0.2) Order Details OrderID 10522 10523 10524 ProductID 10 41 7 UnitPrice

Funcionamiento de un desencadenador DELETE

Instrucción DELETE en tabla con desencadenador DELETEInstrucción DELETE en tabla con desencadenador DELETE

Deleted

4 Dairy Products Cheeses 0x15…

Instrucción DELETE registrada

Categories

CategoryID

1

2

3

CategoryName

Beverages

Condiments

Confections

Description

Soft drinks, coffees…

Sweet and savory …

Desserts, candies, …

Picture

0x15…

0x15…

0x15…

0x15…CheesesDairy Products4

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

Products

ProductID Discontinued … …

1

2

3

4

0

0

0

0

Acción del desencadenador ejecutada

2 1

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

1

2

3

Page 13: Implementación de desencadenadores€¦ · Introducción a los desencadenadores ... (10525, 2, 19.00, 5, 0.2) Order Details OrderID 10522 10523 10524 ProductID 10 41 7 UnitPrice

Funcionamiento de un desencadenador UPDATE

Instrucción UPDATE para una tabla con un desencadenador

UPDATE definido

UPDATE Employees

SET EmployeeID = 17

WHERE EmployeeID = 2

Instrucción UPDATE registrada como instrucciones INSERT y

DELETE

Employees

EmployeeID LastName FirstName Title HireDate

1

2

3

4

Davolio

Barr

Leverling

Peacock

Nancy

Andrew

Janet

Margaret

Sales Rep.

R

Sales Rep.

Sales Rep.

~~~

~~~

~~~

~~~

2 Fuller Andrew Vice Pres. ~~~

insertada

17 Fuller Andrew Vice Pres. ~~~

eliminada

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

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

Sales Rep.

Sales Rep.

~~~

~~~

~~~

~~~

2 Fuller Andrew Vice 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

1

2

3

Page 14: Implementación de desencadenadores€¦ · Introducción a los desencadenadores ... (10525, 2, 19.00, 5, 0.2) Order Details OrderID 10522 10523 10524 ProductID 10 41 7 UnitPrice

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

CustomersMex

CustomerID CompanyName Country Phone …

ANATR

ANTON

CENTC

Ana Trujill…

Antonio M…

Centro Co…

Mexico

Mexico

Mexico

(5) 555-4729

(5) 555-3932

(5) 555-3392

~~~

~~~

~~~

CustomersGer

CustomerID CompanyName Country Phone …

ALFKI

BLAUS

DRACD

Alfreds Fu…

Blauer Se…

Drachenb…

Germany

Germany

Germany

030-0074321

0621-08460

0241-039123

~~~

~~~

~~~

El desencadenador

INSTEAD OF dirige

la actualización a la

tabla base

Customers

CustomerID CompanyName Country Phone …

ALFKI

ANATR

ANTON

Alfreds Fu…

Ana Trujill…

Antonio M…

Germany

Mexico

Mexico

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 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

Page 15: Implementación de desencadenadores€¦ · Introducción a los desencadenadores ... (10525, 2, 19.00, 5, 0.2) Order Details OrderID 10522 10523 10524 ProductID 10 41 7 UnitPrice

Funcionamiento de los desencadenadores anidados

2 15

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_UpdateProducts

ProductID UnitsInStock … …

1

3

4

15

15

65

20

Se ejecuta el desencadenadorInStock_Update

Envía un mensaje

Order_Details

OrderID

10522

10523

10524

ProductID

10

41

7

UnitPrice

31.00

9.65

30.00

Quantity

7

9

24

Discount

0.2

0.15

0.0

10525 19.002 0.25

2 15

Page 16: Implementación de desencadenadores€¦ · Introducción a los desencadenadores ... (10525, 2, 19.00, 5, 0.2) Order Details OrderID 10522 10523 10524 ProductID 10 41 7 UnitPrice

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€¦ · Introducción a los desencadenadores ... (10525, 2, 19.00, 5, 0.2) Order Details OrderID 10522 10523 10524 ProductID 10 41 7 UnitPrice

Ejemplos de desencadenadores

Exigir la integridad de los datos

Exigir reglas de empresa

Page 18: Implementación de desencadenadores€¦ · Introducción a los desencadenadores ... (10525, 2, 19.00, 5, 0.2) Order Details OrderID 10522 10523 10524 ProductID 10 41 7 UnitPrice

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

ProductID UnitsInStock … …

1

3

4

15

10

65

20

2 15 Actualizada

BackOrders

ProductID UnitsOnOrder …

1

12

3

15

10

65

2 15 El desencadenador

elimina la fila

Page 19: Implementación de desencadenadores€¦ · Introducción a los desencadenadores ... (10525, 2, 19.00, 5, 0.2) Order Details OrderID 10522 10523 10524 ProductID 10 41 7 UnitPrice

Products

ProductID UnitsInStock … …

1

2

3

4

15

10

65

20

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

La instrucción DELETE seejecuta en la tabla Product

El código del desencadenadorcomprueba la tabla Order Details

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.2

0.15

0.0

9

'No puede procesarse la transacción'

'Este producto tiene historial de pedidos'

Se deshacela transacción

Products

ProductID UnitsInStock … …

1

3

4

15

10

65

20

2 0

Page 20: Implementación de desencadenadores€¦ · Introducción a los desencadenadores ... (10525, 2, 19.00, 5, 0.2) Order Details OrderID 10522 10523 10524 ProductID 10 41 7 UnitPrice

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