Como ya he contado en otros artículos,
( ver
aquí ), los desencadenadores
DDL se pueden ejecutar cada vez
que cree, eliminar , modificar… un
objeto de base de datos. Estos desencadenador o triggers
DDL se les pueden especificar las
opciones de disparo (es decir, el
tipo de operaciones para las que queremos que se activen).
También he contado
en anterior artículo con un ejemplo como se especifica la
ejecución de los disparadores cuando
se crea una tabla nueva, ( ver
aquí ). Sin embargo,
de añadir es que en lugar de especificar un disparador
para cada operación, podemos crear un trigger DDL que se dispare con un grupo de operaciones, en ese caso, el disparador se ejecutará con cada una de las operaciones
de ese grupo de eventos. Por ejemplo, si ha
especificado DDL_DATABASE_LEVEL_EVENTS en lugar de CREATE_TABLE, se registrará
cada eventos de CREATE_TABLE, ALTER_TALBE y DROP_TABLE,
tras su ejecución.
Por ejemplo, podemos crear un trigger
tal que así:
CREATE TRIGGER [ddltrg_CREATE_TABLE_LOG]
ON DATABASE
FOR DDL_DATABASE_LEVEL_EVENTS
AS
/* Tu codigo aqui */
EVENTDATA es una función importante en los triggers DDL.
La función EVENTDATA () se invoca cada vez
un desencadenador DDL se activa. Vamos
a ver cuáles son las opciones que
podemos utilizar con la función EVENTDATE
().
Además de tener un seguimiento sobre las tablas que son
creadas, Otra
requerimiento de los
administradores de bases de datos, es evitar que los usuarios creen tablas o cualquier otro objeto que no se ajusta a
un estándar. Por ejemplo, si desea evitar que los usuarios creen tablas que no tengan un prefijo como por
ejemplo: ‘TBL’ (que
comience el nombre de la tabla por TBL), puede utilizar siguiente
desencadenador DDL.
CREATE TRIGGER [ddltrg_CheckCreateTable]
ON DATABASE
FOR CREATE_TABLE
AS
SET NOCOUNT ON
DECLARE @xmlEventData XML,
@tableName VARCHAR(50)
SET @xmlEventData = eventdata()
SET @tableName = CONVERT(VARCHAR(25), @xmlEventData.query(‘data(/EVENT_INSTANCE/ObjectName)’))
IF LEFT(@tableName, 3) <> ‘tbl’
BEGIN
RAISERROR ( ‘tu no puedes create table cuyo nombre no
comienza por tbl’,
16,-
1 )
ROLLBACK
END
GO
Ahora si intentásemos crear una tabla como la
siguiente:
CREATE TABLE Customer
(
ID INT,
Desccription VARCHAR(50)
)
Obtendriamos un error y la tabla no se …
Obteniendo la salida
Msg 50.000, nivel
16, estado 1, procedimiento ddltrg_,
Línea 17
No se puede crear nombre de la tabla
sin necesidad de iniciar con TBL
Msg 3609, Nivel
16, Estado 2, Línea 1
La transacción terminó en el gatillo.
El lote ha sido abortada.
Se puede ampliar el desencadenador DDL
para incluir a los procedimientos
almacenados, funciones, esquemas…
Además, si desea evitar que los usuarios hagan ALTER_TABLE durante las horas pico, podemos hacer esto mediante la etiqueta XML de PostTime
EVENTDATA ().
Triggers
a nivel de servidor:
Podemos querer auditar las operaciones de creación de base de datos, el disparador ha de crearse a nivel de servidor –
instancia, como por ejemplo para auditar la creación de las bbdd:
CREATE TRIGGER [ddlsvrtrg_CREATE_DATABASE_LOG]
ON ALL SERVER
FOR CREATE_DATABASE
AS
/* Tu codigo aqui */
Este disparador también tendrá EVENTDATA
()
En poco, os pondré
más ejemplos con desencadenador DDL.
Apunte y recopilación por Norman M. Pardell
Puedes consultarme, si deseas cualquier aclaración, pregunta o sugerencia en: Contacto, contestaré tan pronto como me sea posible.