Sunteți pe pagina 1din 40

Desencadenadores

MSc. Edgar Taya Acosta


ESIS-UNJBG
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.

Un 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.
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 y DELETED
con la informacin que ser reemplazada.
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.

El desencadenador y la instruccin que lo activa se


tratan como una sola transaccin, que puede
revertirse desde el desencadenador.

Sise detecta un error grave (por ejemplo, no hay


suficiente espacio en disco), se revierte
automticamente toda la transaccin.
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.

A diferencia de stas, los desencadenadores DML


pueden hacer referencia a columnas de otras tablas.

Por 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.
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
Losdesencadenadores logon activan
procedimientos almacenados en respuesta a un
evento LOGON.

Esteevento se genera cuando se establece una


sesin de usuario con una instancia de SQL Server.

Losdesencadenadores 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.
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
autenticacin.
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.

Seaplican a todos los comandos de un solo tipo en


toda una base de datos o todo un servidor.

Los desencadenadores DDL y DML se crean,


modifican y quitan con una sintaxis Transact-SQL
similar y tienen un comportamiento parecido.
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 = Profesora Base datos',
@recipients = rocio.contreras@gmail.com',
@body = NO olvidar revisar las solemnes',
@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

S-ar putea să vă placă și