Diseñar desencadenadores DDL

Actualizado: 12 de diciembre de 2006

Antes de diseñar un desencadenador DDL, se requiere lo siguiente:

  • Debe comprender el ámbito de los desencadenadores DDL.
  • Debe determinar la instrucción Transact-SQL o el grupo de instrucciones que activan el desencadenador.
ms186406.security(es-es,SQL.90).gifNota de seguridad:
El código perjudicial de los desencadenadores se puede ejecutar con privilegios concentrados. Para obtener más información acerca de cómo reducir la gravedad de esta amenaza, vea Administrar la seguridad de los desencadenadores.

Descripción del ámbito de los desencadenadores

Los desencadenadores DDL pueden activarse en respuesta a un evento de Transact-SQL procesado en la base de datos actual o en el servidor actual. El ámbito del desencadenador depende del evento. Por ejemplo, un desencadenador DDL creado para activarse como respuesta a un evento CREATE TABLE se activará siempre que se produzca un evento CREATE TABLE en la base de datos. Un desencadenador DDL creado para activarse como respuesta a un evento CREATE LOGIN se activará siempre que se produzca un evento CREATE LOGIN en el servidor.

En el ejemplo siguiente, el desencadenador DDL safety se activará siempre que se produzca un evento DROP TABLE o ALTER TABLE en la base de datos:

CREATE TRIGGER safety 
ON DATABASE 
FOR DROP_TABLE, ALTER_TABLE 
AS 
   PRINT 'You must disable Trigger "safety" to drop or alter tables!' 
   ROLLBACK
;

En el ejemplo siguiente, un desencadenador DDL imprime un mensaje si se produce algún evento CREATE DATABASE en la instancia de servidor actual. Utilice la función EVENTDATA para recuperar el texto de la instrucción Transact-SQL correspondiente. Para obtener más información acerca de cómo utilizar EVENTDATA con desencadenadores DDL, vea Usar la función EVENTDATA.

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
DROP TRIGGER ddl_trig_database
ON ALL SERVER;
GO

Las listas que asignan las instrucciones Transact-SQL a los ámbitos que se pueden especificar para ellas están disponibles en los vínculos de la sección "Seleccionar una instrucción DDL concreta para activar un desencadenador DDL".

Los desencadenadores DDL de ámbito de base de datos se almacenan como objetos en la base de datos donde se crean. Estos desencadenadores se pueden crear en la base de datos master y actuar como los creados en bases de datos diseñadas por el usuario. Se puede obtener información sobre los desencadenadores DDL en la vista de catálogo sys.triggers desde el contexto de base de datos donde se crean o bien mediante la especificación del nombre de base de datos como un identificador (por ejemplo, master.sys.triggers).

Los desencadenadores DDL de ámbito de servidor se almacenan como objetos en la base de datos master. Sin embargo, se puede obtener información sobre los desencadenadores DDL de ámbito de servidor desde la vista de catálogo sys.server_triggers en cualquier contexto de base de datos.

Para obtener más información sobre cómo recuperar metadatos para desencadenadores DDL, vea Obtener información acerca de los desencadenadores DDL.

Los desencadenadores DDL no se activan como respuesta a eventos que afectan a procedimientos almacenados y tablas temporales, ya sean locales o globales.

Especificar una instrucción o grupo de instrucciones Transact-SQL

Los desencadenadores DDL se pueden crear para activarse como respuesta a los siguientes eventos:

  • Una o varias instrucciones DDL determinadas
  • Un grupo de instrucciones DDL predefinidas

Seleccionar una instrucción DDL concreta para activar un desencadenador DDL

Los desencadenadores DDL se pueden diseñar para activarse después de ejecutar una o varias instrucciones Transact-SQL determinadas. En el ejemplo anterior, el desencadenador safety se activa después de un evento DROP TABLE o ALTER TABLE.

No todos los eventos DDL pueden utilizarse para activar desencadenadores DDL. Algunos eventos están diseñados únicamente para instrucciones asincrónicas no transaccionales. Por ejemplo, no se puede utilizar un evento ADD_ROLE_MEMBER para activar un desencadenador DDL. Para estos eventos debe utilizar notificaciones de eventos. Para obtener más información acerca de las notificaciones de eventos, vea Notificaciones de eventos (motor de base de datos).

En el tema Usar eventos de DDL con desencadenadores DDL se muestran las instrucciones Transact-SQL que se pueden especificar para activar un desencadenador DDL y el ámbito donde se pueden activar.

Seleccionar un grupo predefinido de instrucciones DDL para activar un desencadenador DDL

Los desencadenadores DDL se pueden activar tras la ejecución de un evento de Transact-SQL que pertenezca a una agrupación predefinida de eventos similares. Por ejemplo, si desea activar un desencadenador DDL después de que se ejecute una instrucción CREATE TABLE, ALTER TABLE o DROP TABLE, puede especificar FOR DDL_TABLE_EVENTS en la instrucción CREATE TRIGGER. Después de ejecutar CREATE TRIGGER, los eventos incluidos en un grupo de eventos se agregan a la vista de catálogo sys.trigger_events.

En el tema Usar grupos de eventos con desencadenadores DDL se muestran los grupos predefinidos de instrucciones DDL disponibles para los desencadenadores DDL, las instrucciones concretas que incluyen y los ámbitos donde se pueden programar estos grupos de eventos.

Vea también

Conceptos

Usar la función EVENTDATA
Descripción de los desencadenadores DDL
Implementar desencadenadores DDL

Ayuda e información

Obtener ayuda sobre SQL Server 2005

Historial de cambios

Versión Historial

12 de diciembre de 2006

Contenido modificado:
  • Se ha corregido la información incorrecta donde se afirmaba que el evento CREATE_DATABASE no podía utilizarse para activar un desencadenador DDL. Este evento se ha reemplazado por ADD_ROLE_MEMBER como ejemplo de un evento que puede utilizarse para activar una notificación de evento, pero no un desencadenador DDL.

17 de julio de 2006

Contenido modificado:
  • Se ha actualizado el segundo ejemplo en "Descripción del ámbito de los desencadenadores".