Triggers en Transact SQL
Un trigger( o desencadenador) es una clase especial
de procedimiento almacenado que se ejecuta automáticamente cuando se
produce un evento en el servidor de bases de datos.
SQL Server proporciona los siguientes tipos de triggers:
-
Trigger 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 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 trigger 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.
La sintaxis general de un trigger es la siguiente.
CREATE TRIGGER <Trigger_Name, sysname, Trigger_Name> ON <Table_Name, sysname, Table_Name> AFTER <Data_Modification_Statements, , INSERT,DELETE,UPDATE> AS BEGIN-- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; -- Insert statements for trigger here END |
Las instrucciones de triggers DML utilizan dos tablas especiales denominadas inserted y deleted. SQL Server 2005 crea y administra automáticamente ambas tablas. La estructura de las tablas inserted y deleted es la misma que tiene la tabla que ha desencadenado la ejecución del trigger.
La primera tabla (inserted) solo está disponible en las operaciones INSERT y UPDATE y en ella están los valores resultantes despues de la inserción o actualización. Es decir, los datos insertados. Inserted estará vacia en una operación DELETE.
En la segunda (deleted), disponible en las operaciones UPDATE y DELETE, están los valores anteriores a la ejecución de la actualización o borrado. Es decir, los datos que serán borrados. Deleted estará vacia en una operacion INSERT.
¿No existe una tabla UPDATED? No, hacer una actualización es lo mismo que borrar (deleted) e insertar los nuevos (inserted). La sentencia UPDATE es la única en la que inserted y deleted tienen datos simultaneamente.
No puede se modificar directamente los datos de estas tablas.
El siguiente ejemplo, graba un historico de saldos cada vez que se modifica un saldo de la tabla cuentas.
CREATE TRIGGER TR_CUENTAS ON CUENTAS AFTER UPDATE AS BEGIN-- SET NOCOUNT ON impide que se generen mensajes de textoEND |
UPDATE CUENTAS SET SALDO = SALDO + 10 WHERE IDCUENTA = 1 |
Podemos especificar a que columnas de la tabla debe afectar el trigger.
ALTER TRIGGER TR_CUENTAS ON CUENTAS AFTER UPDATE AS BEGIN-- SET NOCOUNT ON impide que se generen mensajes de textoEND |
ALTER TRIGGER TR_CUENTAS ON CUENTAS AFTER UPDATE AS BEGIN-- SET NOCOUNT ON impide que se generen mensajes de textoEND |
La transacción terminó en el desencadenador. Se anuló el lote.
Podemos activar y desactivar Triggers a tarvés de las siguientes instrucciones.-- Desactiva el trigger TR_CUENTASDISABLE TRIGGER TR_CUENTAS ON CUENTAS GO -- activa el trigger TR_CUENTASENABLE TRIGGER TR_CUENTAS ON CUENTAS GO -- Desactiva todos los trigger de la tabla CUENTASALTER TABLE CUENTAS DISABLE TRIGGER ALL GO-- Activa todos los trigger de la tabla CUENTASALTER TABLE CUENTAS ENABLE TRIGGER ALL |
Trigger DDL
Los trigger 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.
La sintaxis general de un trigger es la siguiente.
CREATE TRIGGER <trigger_name, sysname, table_alter_drop_safety> ON DATABASE FOR <data_definition_statements, , DROP_TABLE, ALTER_TABLE> AS BEGIN ...END |
CREATE TRIGGER TR_SEGURIDAD ON DATABASE FOR DROP_TABLE, ALTER_TABLE AS BEGINRAISERROR ('No está permitido borrar ni modificar tablas !' , 16, 1)END |
No hay comentarios.:
Publicar un comentario