Desencadenadores DDL

Se aplica a: SQL Server Azure SQL Database Azure SQL Managed Instance

Los desencadenadores DDL se inician en respuesta a una variedad de eventos de lenguaje de definición de datos (DDL). Estos eventos corresponden principalmente a las instrucciones Transact-SQL que comienzan por las palabras clave CREATE, ALTER, DROP, GRANT, DENY, REVOKE o UPDATE STATISTICS. Algunos procedimientos almacenados del sistema que ejecutan operaciones de tipo DDL también pueden activar desencadenadores DDL.

Use desencadenadores DDL cuando desee hacer lo siguiente:

  • Impedir determinados cambios en el esquema de la base de datos.

  • Que ocurra algo en la base de datos como respuesta a un cambio realizado en el esquema de la base de datos.

  • Registrar cambios o eventos en el esquema de la base de datos.

Importante

Pruebe los desencadenadores DDL para determinar su respuesta a los procedimientos almacenados del sistema que se ejecutan. Por ejemplo, tanto la instrucción CREATE TYPE como el procedimiento almacenado sp_addtype activarán un desencadenador DDL que se crea en un evento CREATE_TYPE.

Tipos de desencadenadores DDL

Desencadenador DDL de Transact-SQL

Un tipo especial de procedimiento almacenado de Transact-SQL que ejecuta una o más instrucciones Transact-SQL como respuesta a un evento con ámbito de servidor o de base de datos. Por ejemplo, un desencadenador DDL se puede activar si se ejecuta una instrucción como ALTER SERVER CONFIGURATION o si se elimina una tabla mediante DROP TABLE.

Desencadenador DDL de CLR

En lugar de ejecutar un procedimiento almacenado de Transact-SQL, un desencadenador CLR ejecuta uno o más métodos escritos en código administrado que son miembros de un ensamblado creado en .NET Framework y cargado en SQL Server.

Los desencadenadores DDL solo se activan cuando se ejecutan las instrucciones DDL que los desencadenan. Los desencadenadores DDL no se pueden usar como desencadenadores INSTEAD OF. Los desencadenadores DDL no se activan como respuesta a eventos que afectan a procedimientos almacenados y tablas temporales, ya sean locales o globales.

Los desencadenadores DDL no crean las tablas inserted y deleted especiales.

La información acerca de un evento que activa un desencadenador DDL y las modificaciones posteriores provocadas por el mismo se capturan con la función EVENTDATA.

Por cada evento DDL se crean varios desencadenadores.

A diferencia de los desencadenadores DML, los desencadenadores DDL no tienen como ámbito los esquemas. Por tanto, las funciones como OBJECT_ID, OBJECT_NAME, OBJECTPROPERTY y OBJECTPROPERTYEX no se pueden usar para efectuar consultas en metadatos sobre desencadenadores DDL. Utilice en su lugar las vistas de catálogo.

Los desencadenadores DDL con ámbito en el servidor aparecen en el Explorador de objetos de SQL Server Management Studio, en la carpeta Desencadenadores . Dicha carpeta se encuentra en la carpeta Server Objects . Los desencadenadores DDL de ámbito de base de datos aparecen en la carpeta Desencadenadores de bases de datos . Esta carpeta se encuentra en la carpeta Programación de la base de datos correspondiente.

Importante

El código malintencionado de los desencadenadores se puede ejecutar con privilegios concentrados. Para obtener más información sobre cómo reducir este riesgo, vea Administrar la seguridad de los desencadenadores.

Ámbito de desencadenadores DDL

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 la instancia de 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. En el ejemplo se usa la función EVENTDATA para recuperar el texto de la instrucción Transact-SQL correspondiente. Para obtener más información sobre el 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 maestra 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 . Pero 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.

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

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 .

En SQL Server 2005 (9.x), si se crea un desencadenador en un grupo de eventos, sys.trigger_events no incluye la información sobre el grupo de eventos, mientras que sys.trigger_events incluye solo la información sobre los eventos individuales cubiertos por dicho grupo. En SQL Server 2008 (10.0.x) y versiones posteriores, sys.trigger_events conserva los metadatos sobre el grupo de eventos en el que se crean los desencadenadores y también sobre 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 (10.0.x) y versiones posteriores no se aplican a los desencadenadores DDL creados en los grupos de eventos en SQL Server 2005 (9.x).

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 DDL Event Groups.

Tarea Tema
Describe cómo crear, modificar, eliminar o deshabilitar los desencadenadores DDL. Implementar desencadenadores DDL
Describe cómo crear un desencadenador DDL de CLR. Crear desencadenadores CLR
Describe cómo devolver información acerca de los desencadenadores DDL. Obtener información sobre los desencadenadores DDL
Describe cómo devolver información acerca de un evento que activa un desencadenador DDL mediante la función EVENTDATA. Usar la función EVENTDATA
Describe cómo administrar la seguridad de los desencadenadores. Administrar la seguridad de los desencadenadores

Consulte también

Desencadenadores DML
Desencadenadores logon
CREATE TRIGGER (Transact-SQL)
EVENTDATA (Transact-SQL)