Anda di halaman 1dari 40

Rocío Contreras Águila

Primer Semestre 2010


Desencadenadores
Desencadenadores
j Un Desencadenador (Trigger) es un tipo
especial de procedimiento almacenado
que se activa de forma controlada por
sucesos antes que por llamadas directas.

j Los desencadenadores (Triggers) están


asociados a tablas.
Desencadenadores
j Son una gran herramienta para controlar
las reglas de negocio más complejas que
una simple integridad referencial, los
desencadenadores (Triggers) y las
sentencias que desencadenan su ejecución
trabajan unidas como una transacción.
Desencadenadores
j El grueso de instrucciones de la definición
del Desencadenador deben ser INSERT,
UPDATE o DELETE, aunque se puede
utilizar SELECT.

j No es recomendable ya que el usuario no


espera que se le devuelva registros luego
de agregar o modificar información.
Desencadenadores

j Los desencadenadores (Triggers) siempre


toman acción después de que la
operación 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 inserción de


registros genera automáticamente una tabla
en el cache con la información que intenta
añadir, esta tablita se denomina Õ 
y es a través de esta tabla que se pueden
hacer comparaciones en otras tablas.
Desencadenadores
j Un Desencadenador para eliminación de
registros genera automáticamente una
tabla en el cache con la información que
intenta eliminar, esta tablita se denomina
y es a través de esta tabla
que se pueden hacer comparaciones en
otras tablas.

j Si se trata de un Desencadenador para


actualización se generan ambas tablas
INSERTED con los nuevos datos y
Desencadenadores
j 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
j Para graficar con un ejemplo la idea de un
Desencadenador implementaremos uno,
piense en la siguiente situación:

j Al agregar un nuevo pedido a la tabla de


PEDIDOS se debe incrementar las ventas
del representante que concreto el pedido,
así como también debe reducirse el
número 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
j Para comprobar la ejecución de este
Desencadenador ejecute las siguientes
sentencias:
j Antes de ejecutar un INSERT de prueba,
mostraremos la información con respecto
a un producto
Select * From Productos Where Id_Fab= 'ACI'
AND Id_Producto='41001'
GO
Ejemplo 1
j Ahora la de un representante de ventas
Select nombre, cuota, ventas From
RepVentas Where num_empl = 104
GO
Ejemplo 1
j Ahora agregaremos un pedido
Insert Pedidos Values (111000, '5/15/1996',
2101, 104, 'ACI', '41001', 5, 275)
GO
j 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
j Como se comprobó al agregar un nuevo
pedido automáticamente el
Desencadenador funciona y actualiza las
ventas para el representantes de ventas y
reduce el número de existencias en stock.
Desencadenadores
j SQL Server incluye tres tipos generales
de desencadenadores: DML, DDL y de
inicio de sesión.

j Los desencadenadores DDL se invocan


cuando tiene lugar un evento de lenguaje
de definición de datos (DDL) en el
servidor o la base de datos
Desencadenadores
j Los desencadenadores de inicio de sesión
activan procedimientos almacenados en
respuesta a un evento LOGON. Este
evento se genera cuando se establece una
sesión de usuario con una instancia de
SQL Server.

j Los desencadenadores DML se invocan


cuando un evento de lenguaje de
manipulación 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 instrucción que lo activa se


tratan como una sola transacción, que puede
revertirse desde el desencadenador.

| Sise detecta un error grave (por ejemplo, no hay


suficiente espacio en disco), se revierte
automáticamente toda la transacción.
Desencadenadores DML
j Pueden realizar cambios en cascada
mediante tablas relacionadas de la base de
datos; sin embargo, estos cambios pueden
ejecutarse de manera más eficaz mediante
restricciones de integridad referencial en
cascada.
Desencadenadores DML
| Pueden proteger contra operaciones INSERT, UPDATE
y DELETE incorrectas o dañinas, y exigir otras
restricciones que sean más 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


instrucción 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
j Pueden evaluar el estado de una tabla
antes y después de realizar una
modificación de datos y actuar en función
de esa diferencia.

j Varios desencadenadores DML del mismo


tipo (INSERT, UPDATE o DELETE) en una
tabla permiten realizar distintas acciones
en respuesta a una misma instrucción de
modificación
Desencadenadores DDL
j Los desencadenadores DDL son un tipo
especial de desencadenador que se activa
en respuesta a instrucciones del lenguaje
de definición 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.
j 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
definición 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 también
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 algún 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


sesión de usuario con una instancia de SQL Server.

| Losdesencadenadores logon se activan después


de que termine la fase de autenticación del inicio
de sesión, pero antes de que se establezca la
sesión de usuario realmente.
Desencadenadores LOGON
j Todos los mensajes que se originan
dentro del desencadenador que alcanzaría
normalmente el usuario, como los
mensajes de error y los mensajes de la
instrucción PRINT, se desvían al registro
de errores de SQL Server.

j Los desencadenadores logon no se


activan si se produce un error en la
autenticación.
Desencadenadores LOGON
j Puede utilizar desencadenadores logon
para realizar auditorías y controlar
sesiones de servidor, como el seguimiento
de la actividad de inicio de sesión, la
restricción de inicios de sesión en SQL
Server o la limitación del número de
sesiones para un inicio de sesión
específico.
Ejemplo: Desencadenadores
LOGON
j En el siguiente código, el desencadenador
logon rechaza los intentos de iniciar
sesión en SQL Server iniciados por el
inicio de sesión á  si ya hay tres
sesiones de usuario creadas por dicho
inicio de sesión.
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
j Los desencadenadores DDL y DML se
utilizan con finalidades distintas.

j 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.

| Losdesencadenadores 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 instrucción
Transact-SQL.

| Asimismo, un desencadenador DDL y la instrucción que lo


activa se ejecutan en la misma transacción. Esta transacción
se puede revertir desde el desencadenador.

| Los errores graves pueden hacer que se revierta


automáticamente la totalidad de una transacción.

| Si se ejecutan desencadenadores DDL desde un lote y se


incluye explícitamente la instrucción ROLLBACK
TRANSACTION, se cancelará todo el lote.
Diferencias entre desencadenadores
DML y DDL
j Para crear un trigger DML, es necesario contar con
permiso ALTER sobre la tabla o vista en la que se crea
el trigger.

j 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 electrónico de
aviso. Este ejemplo envía un mensaje de correo electrónico 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 sólo pueden hacer


referencia a las columnas en que se han definido las
restricciones de columna o de tabla, cualquier restricción 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 inserción.
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 sinónimos 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 función EVENTDATA para recuperar el texto de la instrucción 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