Diseñar desencadenadores DDL

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

  • Debe comprender el ámbito del desencadenador DDL.

  • Debe determinar la instrucción Transact-SQL o el grupo de instrucciones que activan el desencadenador.

Nota de seguridadNota 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 este riesgo, vea Administrar la seguridad de los desencadenadores.

Nota

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

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 o en la instancia de servidor. Un desencadenador DDL creado para activarse como respuesta a un evento CREATE_LOGIN se activará únicamente cuando 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. El ejemplo usa la función EVENTDATA para recuperar el texto de la instrucción Transact-SQL correspondiente. Para obtener más información acerca del uso de 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. Para obtener información acerca de los desencadenadores DDL, consulte la vista de catálogo sys.triggers. Puede consultar sys.triggers dentro del contexto de la base de datos en la que se crean los desencadenadores o si especifica el nombre de la base de datos como un identificador, como master.sys.triggers.

Los desencadenadores DDL de ámbito de servidor se almacenan como objetos en la base de datos maestra. Sin embargo, puede obtenerse información sobre los desencadenadores DDL de ámbito de servidor si se consulta 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.

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

Se pueden crear desencadenadores DDL para que se activen como respuesta a una o varias instrucciones DDL determinadas o a un grupo predefinido de instrucciones DDL.

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 anterior ejemplo, el desencadenador safety se activa después de un evento DROP_TABLE o ALTER_TABLE. Para obtener una lista de las instrucciones Transact-SQL que pueden especificarse para activar un desencadenador DDL y el ámbito en el que el desencadenador se puede activar, vea Eventos DDL.

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.

Nota

En SQL Server 2005, si se crea un desencadenador en un grupo de eventos, sys.trigger_events no incluye la información acerca del grupo de eventos, mientras que sys.trigger_events incluye solo la información acerca de los eventos individuales cubiertos por dicho grupo. En SQL Server 2008, sys.trigger_events conserva los metadatos acerca del grupo de eventos en el que se crean los desencadenadores y también acerca de los eventos individuales cubiertos por el grupo de eventos. Por consiguiente, los cambios en los eventos cubiertos por los grupos de eventos en SQL Server 2008 no se aplican a los desencadenadores DDL creados en los grupos de eventos en SQL Server 2005.

Para obtener una lista de los grupos predefinidos de instrucciones DDL disponibles para los desencadenadores DDL, las instrucciones concretas que cubren los grupos de eventos y los ámbitos donde se pueden programar estos grupos de eventos, vea Grupos de eventos DDL.