BASE DE DATOS II
Lic. Rosa Irene López Loza
Triggers DDL
Características
Esta clase de Triggers se activa en eventos que modifican la
estructura de la base de datos (como crear, modificar o
eliminar una tabla) o en ciertos eventos relacionados con el
servidor, como cambios de seguridad o actualización de
eventos estadísticos
Se ejecutan en respuesta a una variedad de eventos de
lenguaje de definición de datos (DDL) y también a
determinados procedimientos almacenados del sistema que
ejecutan operaciones de tipo DDL.
Eventos de un Trigger DDL
Los eventos que hacen que se dispare un Trigger DDL
según el alcance de los mismos, son de dos tipos:
❖ Eventos que tienen alcance de base de datos
❖ Eventos que tienen alcance de servidor
Sintaxis General
CREATE [ OR ALTER ] TRIGGER NombreTrigger
ON { ALL SERVER | DATABASE }
{ FOR | AFTER } { TipoEvento | GrupoEventos } [ ,…n ]
AS
Begin
Instrucciones T-SQL
End
Algunas consideraciones
Para prohibir una instrucción DDL Al definir un trigger DDL, es
en el trigger asociado, es necesario indicar la instrucción
necesario anular la transacción DDL que permite su ejecución,
con la instrucción ROLLBACK. así como su ámbito.
Para seguir mejor las diferentes
ejecuciones de las instrucciones No es posible definir triggers DDL
DDL, es posible utilizar la función de tipo instead of.
EVENTDATA() en los triggers DDL.
Transacción
Una transacción es un conjunto de operaciones que serán tratadas como una
sola.
El conjunto de operaciones debe marcarse como transacción para que todas
las operaciones que la conforman tengan éxito o fracasen.
Estas transacciones deben cumplir 4 propiedades fundamentales comúnmente
conocidas como ACID (atomicidad, coherencia, asilamiento y durabilidad).
La transacción más simple en SQL Server es una única sentencia SQL.
Ejemplo:
UPDATE Productos SET PrecioUnitario = 20 WHERE NombreProducto = ‘ C '
Sentencias para una transacción
SENTENCIAS DESCRIPCIÓN
BEGIN TRAN Se utiliza para indicar el comienzo de una
transacción.
ROLLBACK Se utiliza para deshacer todas las modificaciones
TRANSACTION realizadas, si alguna de las operaciones de la
transacción falla, y debe volver al estado inicial en el
que estaba la base de datos antes de empezar.
COMMIT Se utiliza para confirmar las modificaciones
TRANSACTION realizadas, si todas las operaciones de una
transacción se completan con éxito.
Activar, Desactivar y Eliminar un Trigger
Activar: ENABLE TRIGGER {Nombre_Trigger} ON DATABASE
Eliminar : DROP TRIGGER {Nombre_Trigger} ON DATABASE
Desactivar: DISABLE TRIGGER {Nombre_Trigger} ON DATABASE
Ejemplo. Crear un Trigger para evitar que se
creen, eliminen o modifiquen tablas
CREATE TRIGGER trNoCrearEliminarModificarTablas
ON DataBase
FOR CREATE_TABLE, DROP_TABLE, ALTER_TABLE
AS
BEGIN
RAISERROR (‘TRANSACCIÓN ANULADA! No se permite crear, eliminar o editar
tablas’ , 16, 1)
Rollback transaction
END
go
FUNCIÓN EVENTDATA ()
Esta función devuelve información sobre eventos del servidor o de la
base de datos.
Un Trigger DDL admite el uso interno de EVENTDATA.
Sintaxis:
EventData()
FUNCIÓN EVENTDATA ()
La información acerca de un evento que activa un desencadenador DDL se
captura mediante la función EVENTDATA.
Esta función devuelve un valor XML .
El esquema XML incluye información acerca de lo siguiente:
La hora del evento.
El Id. de proceso del sistema (SPID) de la conexión en la cual se ha ejecutado
el desencadenador.
El tipo de evento que ha activado el desencadenador.
En función del tipo de evento, el esquema incluirá información adicional, como la
base de datos en la que se ha producido el evento, el objeto en el que se ha
producido el evento y la instrucción Transact-SQL del evento
Ejemplo
Crear un trigger DDL que se dispara cada vez que se crea
una tabla. La función eventdata devuelve, en formato
XML, los datos del trigger.
CREATE TRIGGER DDL_TEST
ON DATABASE
FOR CREATE_TABLE
AS
PRINT CONVERT(varchar(max),eventdata()))
EJEMPLO: Crear un Trigger que se dispare cuando
se crea una vista y capture el evento creado.
CREATE TRIGGER trCapturarCrearVista
on Database
For Create_View
As
Begin
Select EVENTDATA()
End
go
Crear una vista para que el trigger
creado se dispare
CREATE VIEW vistaMedicos
As
SELECT IdMedico 'Código',
nombreMedico+' '+ApPaternoMedico+'
'+apMaternoMedico as Nombre, turno turno
FROM Medicos
GO
Ejemplo: Crear un trigger que se dispare al crear, modificar o
eliminar un procedimiento almacenado, almacenar la instrucción
ejecutada en una tabla PHistorial
1ro. crear la tabla. CREATE TABLE PHistorial
(TipoEvento nvarchar(200),
Fecha DateTime,
Servidor nvarchar(100),
InicioSesion nvarchar(100),
Equipo nvarchar(100),
ComandoTSQL nvarchar(400)
)
CREATE TRIGGER trHistoriaPA
on Database
for Create_Procedure, Alter_Procedure, Drop_Procedure
As
Begin
insert into PHistorial
(TipoEvento, Fecha, Servidor, InicioSesion, Equipo, ComandoTSQL)
2do.
Select EVENTDATA().value
Crear el (‘(/EVENT_INSTANCE/EventType)[1]’,’nvarchar(200)’),
Trigger EVENTDATA().value (‘(/EVENT_INSTANCE/PostTime)[1]’,’Datetime’),
EVENTDATA().value (‘(/EVENT_INSTANCE/ServerName)[1]’,’nvarchar(100)’),
EVENTDATA().value (‘(/EVENT_INSTANCE/LoginName)[1]’,’nvarchar(100)’),
HOST_NAME(), EVENTDATA().value
(‘(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]’,’nvarchar(400)’)
End
Para que el Trigger se dispare, crear un
procedimiento almacenado para listar los Pacientes
3ro. Crear el Procedimiento Almacenado
Create procedure spPacientesListado
As
Select IdPac As ‘Código’, NomPaciente As ‘Paciente’
from Pacientes
order by Paciente
go
Modificar el procedimiento para incluir un campo
adicional
Alter procedure spPacientesListado
As
Select IdPac ‘Código’, NomPaciente ‘Paciente’, dirPaciente
‘Dirección’
from Pacientes
order by Paciente
go
Borrar el Procedimiento Almacenado
Drop procedure spClientesListado
go
Para visualizar el contenido del historial
select * from PHistorial
go