Anda di halaman 1dari 40

Desencadenadores Trigger

Desencadenadores

Un Desencadenador (Trigger) es un tipo especial de procedimiento almacenado que se activa de forma controlada por sucesos antes que por llamadas directas. Los desencadenadores (Triggers) estn asociados a tablas.

Desencadenadores

Son una gran herramienta para controlar las reglas de negocio ms complejas que una simple integridad referencial, los desencadenadores (Triggers) y las sentencias que desencadenan su ejecucin trabajan unidas como una transaccin.

Desencadenadores

El grueso de instrucciones de la definicin del Desencadenador deben ser INSERT, UPDATE o DELETE, aunque se puede utilizar SELECT. No es recomendable ya que el usuario no espera que se le devuelva registros luego de agregar o modificar informacin.

Desencadenadores

Los desencadenadores (Triggers) siempre toman accin despus de que la operacin fue registrada en el log.

Desencadenadores
Bien

en general cuando trabaja con desencadenadores (Triggers), tiene que recordar que los CONSTRAINTS se verifican primero, de cumplirse con los datos solicitados se ejecutar el Desencadenador. Desencadenador para insercin de registros genera automticamente una tabla en el cache con la informacin que intenta aadir, esta tablita se denomina INSERTED y es a travs de esta tabla que se pueden hacer comparaciones en otras tablas.

Un

Desencadenadores

Un Desencadenador para eliminacin de registros genera automticamente una tabla en el cache con la informacin que intenta eliminar, esta tablita se denomina DELETED y es a travs de esta tabla que se pueden hacer comparaciones en otras tablas.

Si se trata de un Desencadenador para actualizacin se generan ambas tablas INSERTED con los nuevos datos DELETED con la informacin que ser

Desencadenadores

Para crear un Desencadenador puede utilizar el siguiente formato:


CREATE TRIGGER<Nombre del Desencadenador> ON <Nombre de la Tabla> FOR <INSERT l UPDATE l DELETE> AS Sentencias. GO

Ejemplo 1

Para graficar con un ejemplo la idea de un Desencadenador implementaremos uno, piense en la siguiente situacin: Al agregar un nuevo pedido a la tabla de PEDIDOS se debe incrementar las ventas del representante que concreto el pedido, as como tambin debe reducirse el nmero de existencias.

Ejemplo 1

Para ello debe crear el siguiente Desencadenador:

Use Ejemplo GO CREATE TRIGGER NuevoPedido ON Pedidos FOR INSERT AS UPDATE RepVentas SET VENTAS =VENTAS + INSERTED.IMPORTE FROM REPVENTAS INNER JOIN INSERTED ON REPVENTAS.NUM_EMPL = INSERTED.REP UPDATE PRODUCTOS SET EXISTENCIAS = EXISTENCIAS - INSERTED.CANT FROM PRODUCTOS INNER JOIN INSERTED ON PRODUCTOS.ID_FAB = INSERTED.FAB AND PRODUCTOS.ID_PRODUCTO = INSERTED.PRODUCTO GO

Ejemplo 1
Para comprobar la ejecucin de este Desencadenador ejecute las siguientes sentencias: Antes de ejecutar un INSERT de prueba, mostraremos la informacin con respecto a un producto

Select * From Productos Where Id_Fab= 'ACI' AND Id_Producto='41001' GO

Ejemplo 1
Ahora la de un representante de ventas Select nombre, cuota, ventas From RepVentas Where num_empl = 104 GO

Ejemplo 1
Ahora agregaremos un pedido Insert Pedidos Values (111000, '5/15/1996', 2101, 104, 'ACI', '41001', 5, 275) GO Verifique los resultados anteriores Select * From Productos Where Id_Fab= 'ACI' AND Id_Producto='41001' GO

Ejemplo 1
Select nombre, cuota, ventas From RepVentas Where num_empl = 104 GO

Ejemplo 1

Como se comprob al agregar un nuevo pedido automticamente el Desencadenador funciona y actualiza las ventas para el representantes de ventas y reduce el nmero de existencias en stock.

Desencadenadores

SQL Server incluye tres tipos generales de desencadenadores: DML, DDL y de inicio de sesin.

Los desencadenadores DDL se invocan cuando tiene lugar un evento de lenguaje de definicin de datos (DDL) en el servidor o la base de datos

Desencadenadores

Los desencadenadores de inicio de sesin activan procedimientos almacenados en respuesta a un evento LOGON. Este evento se genera cuando se establece una sesin de usuario con una instancia de SQL Server. Los desencadenadores DML se invocan cuando un evento de lenguaje de manipulacin de datos (DML) tiene lugar en la base de datos

Desencadenadores DML
Los

eventos DML incluyen instrucciones INSERT, UPDATE o DELETE que modifican datos en una tabla o vista especificada.

Un

desencadenador DML puede consultar otras tablas e incluir instrucciones Transact-SQL complejas. desencadenador y la instruccin que lo activa se tratan como una sola transaccin, que puede revertirse desde el desencadenador. se detecta un error grave (por ejemplo, no hay suficiente espacio en disco), se revierte automticamente toda la transaccin.

El

Si

Desencadenadores DML

Pueden realizar cambios en cascada mediante tablas relacionadas de la base de datos; sin embargo, estos cambios pueden ejecutarse de manera ms eficaz mediante restricciones de integridad referencial en cascada.

Desencadenadores DML
Pueden

proteger contra operaciones INSERT, UPDATE y DELETE incorrectas o dainas, y exigir otras restricciones que sean ms complejas que las definidas con restricciones CHECK. de stas, los desencadenadores DML pueden hacer referencia a columnas de otras tablas. ejemplo, un desencadenador puede utilizar una instruccin SELECT de otra tabla para comparar con los datos insertados o actualizados y para realizar acciones adicionales, como modificar los datos o mostrar un mensaje de error definido por el usuario.

A diferencia

Por

Desencadenadores DML

Pueden evaluar el estado de una tabla antes y despus de realizar una modificacin de datos y actuar en funcin de esa diferencia. Varios desencadenadores DML del mismo tipo (INSERT, UPDATE o DELETE) en una tabla permiten realizar distintas acciones en respuesta a una misma instruccin de modificacin

Desencadenadores DDL
Los desencadenadores DDL son un tipo especial de desencadenador que se activa en respuesta a instrucciones del lenguaje de definicin de datos (DDL). Se pueden usar para realizar tareas administrativas en la base de datos, como auditar y regular las operaciones de base de datos. No se puede revertir un evento ALTER DATABASE producido dentro del cuerpo de un desencadenador DDL.

Desencadenadores DDL

Los desencadenadores DDL, al igual que los desencadenadores habituales, activan procedimientos almacenados como respuesta a un evento. Sin embargo, a diferencia de los desencadenadores DML, no se activan como respuesta a las instrucciones UPDATE, INSERT o DELETE de una tabla o vista. En cambio, s se activan en respuesta a diversos eventos del lenguaje de definicin de datos (DDL). Estos eventos corresponden principalmente a instrucciones Transact-SQL que comienzan por las palabras clave CREATE, ALTER y DROP. Determinados procedimientos almacenados del sistema que realizan operaciones de estilo DDL tambin pueden activar desencadenadores DDL.

Desencadenadores DDL

Los desencadenadores DDL pueden utilizarse para tareas administrativas como auditar y regular las operaciones de base de datos. Utilice los desencadenadores DDL cuando:
Desee evitar determinados cambios en el esquema de base de datos. Desee que ocurra algn evento en la base de datos como respuesta a un cambio realizado en el esquema de base de datos. Desee registrar cambios o eventos del esquema de base de datos.

Ejemplo: Desencadenadores DDL


CREATE TRIGGER safety ON DATABASE FOR DROP_TABLE, ALTER_TABLE AS PRINT debe desactivar el trigger de seguridad para eliminar o modificar las tablas ROLLBACK ;

Desencadenadores LOGON
Los

desencadenadores logon activan procedimientos almacenados en respuesta a un evento LOGON. evento se genera cuando se establece una sesin de usuario con una instancia de SQL Server. desencadenadores logon se activan despus de que termine la fase de autenticacin del inicio de sesin, pero antes de que se establezca la sesin de usuario realmente.

Este

Los

Desencadenadores LOGON

Todos los mensajes que se originan dentro del desencadenador que alcanzara normalmente el usuario, como los mensajes de error y los mensajes de la instruccin PRINT, se desvan al registro de errores de SQL Server. Los desencadenadores logon no se activan si se produce un error en la

Desencadenadores LOGON

Puede utilizar desencadenadores logon para realizar auditoras y controlar sesiones de servidor, como el seguimiento de la actividad de inicio de sesin, la restriccin de inicios de sesin en SQL Server o la limitacin del nmero de sesiones para un inicio de sesin especfico.

Ejemplo: Desencadenadores LOGON

En el siguiente cdigo, el desencadenador logon rechaza los intentos de iniciar sesin en SQL Server iniciados por el inicio de sesin login_test si ya hay tres sesiones de usuario creadas por dicho inicio de sesin.

Ejemplo: Desencadenadores LOGON


USE master; GO CREATE LOGIN login_test WITH PASSWORD = '3KHJ6dhx(0xVYsdf' MUST_CHANGE, CHECK_EXPIRATION = ON; GO GRANT VIEW SERVER STATE TO login_test; GO CREATE TRIGGER connection_limit_trigger ON ALL SERVER WITH EXECUTE AS 'login_test' FOR LOGON AS BEGIN IF ORIGINAL_LOGIN()= 'login_test' AND (SELECT COUNT(*) FROM sys.dm_exec_sessions WHERE is_user_process = 1 AND original_login_name = 'login_test') > 3 ROLLBACK; END;

Diferencias entre desencadenadores DML y DDL

Los desencadenadores DDL y DML se utilizan con finalidades distintas. Los desencadenadores DML funcionan con las instrucciones INSERT, UPDATE y DELETE, y permiten exigir las reglas de negocios y extender la integridad de los datos cuando se modifican datos en tablas o vistas.

Diferencias entre desencadenadores DML y DDL


Los

desencadenadores DDL funcionan en instrucciones DDL CREATE, ALTER, DROP entre otras, y en procedimientos almacenados que realizan operaciones similares a DDL. Se utilizan para realizar tareas administrativas y exigir las reglas de negocios que afectan a las bases de datos. aplican a todos los comandos de un solo tipo en toda una base de datos o todo un servidor. desencadenadores DDL y DML se crean, modifican y quitan con una sintaxis Transact-SQL similar y tienen un comportamiento parecido.

Se

Los

Diferencias entre desencadenadores DML y DDL

Al igual que los desencadenadores DML, se pueden crear varios desencadenadores DDL en la misma instruccin Transact-SQL.
Asimismo, un desencadenador DDL y la instruccin que lo activa se ejecutan en la misma transaccin. Esta transaccin se puede revertir desde el desencadenador. Los errores graves pueden hacer que se revierta automticamente la totalidad de una transaccin. Si se ejecutan desencadenadores DDL desde un lote y se incluye explcitamente la instruccin ROLLBACK TRANSACTION, se cancelar todo el lote.

Diferencias entre desencadenadores DML y DDL

Para crear un trigger DML, es necesario contar con permiso ALTER sobre la tabla o vista en la que se crea el trigger. Para crear un trigger DDL con mbito en el servidor (ON ALL SERVER) es necesario un permiso CONTROL SERVER sobre el servidor. Para crear un trigger DDL con mbito en la base de datos (ON DATABASE) es necesario un permiso ALTER ANY DATABASE DDL TRIGGER en la base de datos actual

Ejemplo 2
Utilizar

un trigger DML con un mensaje de aviso. El siguiente trigger DML imprime un mensaje en el cliente cuando alguien intenta agregar o cambiar datos en la tabla Customer.

CREATE TRIGGER recordatorio1 ON Sales.Customer AFTER INSERT, UPDATE AS RAISERROR ('Notify Customer Relations', 16, 10) GO

Ejemplo 3

Utilizar un trigger DML con un mensaje de correo electrnico de aviso. Este ejemplo enva un mensaje de correo electrnico a una persona especificada (YO) cuando cambia la tabla Customer.

CREATE TRIGGER recordatorio ON Sales.Customer AFTER INSERT, UPDATE, DELETE AS EXEC msdb.dbo.sp_send_dbmail @profile_name = Profesor Base datos', @recipients = felipe.huejutla@hotmail.com', @body = NO olvidar revisar los cambios', @subject = Recordatorio'; GO

Ejemplo 3

Utilizar un trigger DML AFTER para exigir una regla de negocio entre las tablas PurchaseOrderHeader y Vendor Debido a que las restricciones CHECK slo pueden hacer referencia a las columnas en que se han definido las restricciones de columna o de tabla, cualquier restriccin de referencias cruzadas, en este caso, reglas de negocio, debe definirse como triggers. En este ejemplo se crea un trigger DML. El trigger comprueba que la solvencia del proveedor es satisfactoria cuando se intenta insertar un nuevo pedido de compra en la tabla PurchaseOrderHeader. Para obtener la solvencia del proveedor, debe hacerse referencia a la tabla Vendor. Si la solvencia no es satisfactoria, se muestra un mensaje y no se ejecuta la insercin.

Ejemplo 3
CREATE TRIGGER LowCredit ON Purchasing.PurchaseOrderHeader AFTER INSERT AS DECLARE @creditrating tinyint, @vendorid int SELECT @creditrating = v.CreditRating, @vendorid = p.VendorID FROM Purchasing.PurchaseOrderHeader p INNER JOIN inserted i ON p.PurchaseOrderID = i.PurchaseOrderID JOIN Purchasing.Vendor v on v.VendorID = i.VendorID IF @creditrating = 5 BEGIN RAISERROR ('This vendor''s credit rating is too low to accept new purchase orders.', 16, 1) ROLLBACK TRANSACTION END

Ejemplo 4

Utilizar un trigger DDL con mbito en la base de datos. En el ejemplo siguiente se utiliza un trigger DDL para impedir que se quiten sinnimos en una base de datos

IF EXISTS (SELECT * FROM sys.triggers WHERE parent_class = 0 AND name = 'safety') DROP TRIGGER safety ON DATABASE GO CREATE TRIGGER safety ON DATABASE FOR DROP_SYNONYM AS RAISERROR ('You must disable Trigger "safety" to drop synonyms!',10, 1) ROLLBACK GO

Ejemplo 5

Utilizar un trigger DDL con mbito en el servidor . En el ejemplo siguiente se utiliza un trigger DDL para imprimir un mensaje si se produce un evento CREATE DATABASE en la instancia actual del servidor, y se utiliza la funcin EVENTDATA para recuperar el texto de la instruccin Transact-SQL correspondiente.
IF EXISTS (SELECT * FROM sys.server_triggers WHERE name = 'ddl_trig_database') DROP TRIGGER ddl_trig_database ON ALL SERVER GO CREATE TRIGGER ddl_trig_database ON ALL SERVER FOR CREATE_DATABASE AS PRINT 'Database Created.' SELECT EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar( max)') GO

Anda mungkin juga menyukai