| También llamados Trigger, los Desencadenadores son procedimientos almacenados, creados para ejecutarse automáticamente cuando ocurra un evento en una tabla o vista de la base de datos. Dichos eventos son generados por los comandos INSERT, UPDATE y DELETE Según el tipo de evento que los desencadena se clasifican en: Trigger DDL: Los desencadenadores DDL se ejecutan en respuesta a una variedad de eventos de lenguaje de definición de datos (DDL). Estos eventos corresponden principalmente a instrucciones CREATE, ALTER y DROP de Transact-SQL, y a determinados procedimientos almacenados del sistema que ejecutan operaciones de tipo DDL. Trigger DML: los desencadenadores DML se ejecutan cuando un usuario intenta modificar datos mediante un evento de lenguaje de manipulación de datos (DML). Los eventos DML son instrucciones INSERT, UPDATE o DELETE de una tabla o vista. Trigger LOGON: Los desencadenadores logon se activan en respuesta al evento LOGON que se genera cuando se establece la sesión de un usuario. Antes de ver un ejemplo conozcamos las tablas inserted y deleted. La estructura de ambas es la misma que tiene la tabla que ha desencadenado la ejecución del trigger. inserted existe con INSERT y UPDATE deleted existe con UPDATE y DELETE Los usos de los Trigger van desde el bloqueo de la eliminaciòn mùltiple, las actualizaciones de Stock y los bloqueos de modificaciones Ejemplo 1: Creamos un disparador para que se ejecute cada vez que una instrucción «insert» ingrese datos en «ventas»; el mismo controlará que haya stock en «Artìculos» y actualizará el campo «stock»: Create Trigger DIS_ventas_insertar on Detalles_De_Comprobante for insert as declare @stock int select @stock= p.Stock from Productos P join inserted on inserted.IdProducto=p.IdProducto where p.IdProducto=inserted.IdProducto if (@stock>=(select cantidad from inserted)) update Productos set Productos.stock=stock-inserted.cantidad from Productos join Inserted on inserted.IdProducto=Productos.IdProducto where Productos.IdProducto=Inserted.IdProducto else begin Print ‘Hay menos Productos en stock de los solicitados para la venta’ Rollback transaction end Ejemplo 2: Creamos un disparador para controlar que no se elimine más de un registro de la tabla «Productos». El disparador se activa cada vez que se ejecuta un «Delete» sobre «Productos», controlando la cantidad de registros que se están eliminando; si se está eliminando más de un registro, el disparador retorna un mensaje de error y deshace la transacción: Create trigger DIS_Productos_borrar on Productos for Delete as if (select count(*) from deleted) > 1 begin Print ‘No puede eliminar más de un Producto’ Rollback transaction end; Los trigger están dentro de la transacción original (Insert, Delete o Update) por lo cual si dentro de nuestro trigger hacemos un RollBack Tran, no sólo estaremos echando atrás nuestro trigger sino también toda la transacción; en otras palabras si en un trigger ponemos un RollBack Tran, la transacción de Insert, Delete o Update volverá toda hacia atrás. En este caso obtendremos el siguiente mensaje de error: La transacción terminó en el desencadenador. Se anuló el lote. |