lunes, 16 de enero de 2017

Triggers (Desencadenadores) en Sql Server

Aspectos básicos

Los triggers son un tipo especial de procedimientos almacenados que se ejecutan automáticamente al producirse una modificación de una tabla. Los triggers poseen la utilidad de integrar en la base de datos decisiones de negocio asociadas a los propios datos, sin que sea necesario programar procedimientos externos. Permiten mantener coherencia semántica en la base de datos.
Triggers (Desencadenadores) en Sql Server
Se suelen utilizar para:
-Implementar restricciones complejas de seguridad o integridad.
-Prevenir transacciones erróneas.
-Implementar reglas administrativas complejas.
-Generar automáticamente valores derivados.
-Auditar las actualizaciones e, incluso, enviar alertas.
-Gestionar replicas remotas de la tabla.


Los disparadores se ejecutan DESPUES de la ejecución de una instrucción "insert", "update" o "delete" en la tabla en la que fueron definidos. Las restricciones se comprueban ANTES de la ejecución de una instrucción "insert", "update" o "delete". Por lo tanto, las restricciones se comprueban primero, si se infringe alguna restricción, el desencadenador no llega a ejecutarse.
Los triggers se crean con la instrucción "create trigger". Esta instrucción especifica la tabla en la que se define el disparador, los eventos para los que se ejecuta y las instrucciones que contiene.
Cómo funciona un desencadenador INSERT
1 Se ejecuta la instrucción INSERT 
2 Se registra la instrucción INSERT
3 Se ejecuta el desencadenador AFTER INSERT 

CREATE TRIGGER [insrtWorkOrder] ON [Production].[WorkOrder]
AFTER INSERT AS
BEGIN
 SET NOCOUNT ON;
 INSERT INTO [Production].[TransactionHistory](
 [ProductID],[ReferenceOrderID],[TransactionType]
 ,[TransactionDate],[Quantity],[ActualCost])
 SELECT inserted.[ProductID],inserted.[WorkOrderID]
 ,'W',GETDATE(),inserted.[OrderQty],0 FROM inserted;
End


Cómo funciona un desencadenador DELETE
1 Se ejecuta la instrucción DELETE 
2 Se registra la instrucción DELETE 
3 Se ejecuta el desencadenador AFTER DELETE  
CREATE TRIGGER [delCustomer] ON [Sales].[Customer] 
AFTER DELETE AS 
BEGIN 
 SET NOCOUNT ON; 
 EXEC master..xp_sendmail 
 @recipients=N'SalesManagers@Adventure-Works.com', 
 @message = N'Customers have been deleted!!'; 
END; 
Cómo funciona un desencadenador UPDATE
1 Se ejecuta la instrucción UPDATE 
2 Se registra la instrucción UPDATE  
3 Se ejecuta el desencadenador AFTER UPDATE 
CREATE TRIGGER [updtProductReview] ON 
[Production].[ProductReview] 
AFTER UPDATE NOT FOR REPLICATION AS 
BEGIN 
 UPDATE [Production].[ProductReview] 
 SET [Production].[ProductReview].[ModifiedDate] = 
 GETDATE() FROM inserted 
 WHERE inserted.[ProductReviewID] = 
 [Production].[ProductReview].[ProductReviewID]; 
END; 
Cómo funciona un desencadenador INSTEAD OF
1. Se ejecuta la instrucción UPDATE, INSERT o DELETE.
2. La instrucción ejecutada no se realiza.
3. Se ejecutan las instrucciones del desencadenador INSTEAD OF.
CREATE TRIGGER [delEmployee] ON [HumanResources].[Employee] 
INSTEAD OF DELETE NOT FOR REPLICATION AS BEGIN 
 SET NOCOUNT ON; DECLARE @DeleteCount int; 
 SELECT @DeleteCount = COUNT(*) FROM deleted; 
 IF @DeleteCount > 0 BEGIN
 … 
 END; 
END; 
Consideraciones sobre los desencadenadores recursivos
Están deshabilitados de forma predeterminada. 
ALTER DATABASE AdventureWorks SET RECURSIVE_TRIGGERS ON
Para habilitarlos: Consideraciones:  
  • Puede superar el límite de anidamiento de 32 niveles sin necesidad de realizar un diseño cuidadoso y unas pruebas exhaustivas 
  • Puede resultar difícil controlar el orden de las actualizaciones de tabla 
  • Se puede reemplazar con lógica no recursiva

No hay comentarios.:

Publicar un comentario