Desencadenadores DDLDDL Triggers

Los desencadenadores DDL se inician en respuesta a una variedad de eventos de lenguaje de definición de datos (DDL).DDL triggers fire in response to a variety of Data Definition Language (DDL) events. Estos eventos corresponden principalmente a las instrucciones de Transact-SQLTransact-SQL que comienzan por las palabras clave CREATE, ALTER, DROP, GRANT, DENY, REVOKE o UPDATE STATISTICS.These events primarily correspond to Transact-SQLTransact-SQL statements that start with the keywords CREATE, ALTER, DROP, GRANT, DENY, REVOKE or UPDATE STATISTICS. Algunos procedimientos almacenados del sistema que ejecutan operaciones de tipo DDL también pueden activar desencadenadores DDL.Certain system stored procedures that perform DDL-like operations can also fire DDL triggers.

Use desencadenadores DDL cuando desee hacer lo siguiente:Use DDL triggers when you want to do the following:

  • Impedir determinados cambios en el esquema de la base de datos.Prevent certain changes to your database schema.

  • Que ocurra algo en la base de datos como respuesta a un cambio realizado en el esquema de la base de datos.Have something occur in the database in response to a change in your database schema.

  • Registrar cambios o eventos en el esquema de la base de datos.Record changes or events in the database schema.

Importante

Pruebe los desencadenadores DDL para determinar su respuesta a los procedimientos almacenados del sistema que se ejecutan.Test your DDL triggers to determine their responses to system stored procedures that are run. 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.For example, the CREATE TYPE statement and the sp_addtype stored procedure will both fire a DDL trigger that is created on a CREATE_TYPE event.

Tipos de desencadenadores DDLTypes of DDL Triggers

Desencadenador DDL de Transact-SQLTransact-SQL DDL Trigger
Un tipo especial de procedimiento almacenado de Transact-SQLTransact-SQL que ejecuta una o más instrucciones de Transact-SQLTransact-SQL como respuesta a un evento con ámbito de servidor o de base de datos.A special type of Transact-SQLTransact-SQL stored procedure that executes one more more Transact-SQLTransact-SQL statements in response to a server-scoped or database-scoped event. 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.For example, a DDL Trigger may fire if a statement such as ALTER SERVER CONFIGURATION is executed or if a table is deleted by using DROP TABLE.

Desencadenador DDL de CLRCLR DDL Trigger
En lugar de ejecutar un procedimiento almacenado Transact-SQLTransact-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 ServerSQL Server.Instead of executing a Transact-SQLTransact-SQL stored procedure, a CLR trigger executes one or more methods written in managed code that are members of an assembly created in the .NET Framework and uploaded in SQL ServerSQL Server.

Los desencadenadores DDL solo se activan cuando se ejecutan las instrucciones DDL que los desencadenan.DDL triggers fire only after the DDL statements that trigger them are run. Los desencadenadores DDL no se pueden usar como desencadenadores INSTEAD OF.DDL triggers cannot be used as INSTEAD OF triggers. Los desencadenadores DDL no se activan como respuesta a eventos que afectan a procedimientos almacenados y tablas temporales, ya sean locales o globales.DDL triggers do not fire in response to events that affect local or global temporary tables and stored procedures.

Los desencadenadores DDL no crean las tablas inserted y deleted especiales.DDL triggers do not create the special inserted and deleted tables.

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.The information about an event that fires a DDL trigger, and the subsequent changes caused by the trigger, is captured by using the EVENTDATA function.

Por cada evento DDL se crean varios desencadenadores.Multiple triggers to be created for each DDL event.

A diferencia de los desencadenadores DML, los desencadenadores DDL no tienen como ámbito los esquemas.Unlike DML triggers, DDL triggers are not scoped to schemas. Por tanto, las funciones como OBJECT_ID, OBJECT_NAME, OBJECTPROPERTY y OBJECTPROPERTYEX no se pueden usar para efectuar consultas en metadatos sobre desencadenadores DDL.Therefore, functions such as OBJECT_ID, OBJECT_NAME, OBJECTPROPERTY, and OBJECTPROPERTYEX cannot be used for querying metadata about DDL triggers. Utilice en su lugar las vistas de catálogo.Use the catalog views instead.

Los desencadenadores DDL con ámbito en el servidor aparecen en el Explorador de objetos de SQL Server Management Studio, en la carpeta Desencadenadores .Server-scoped DDL triggers appear in the SQL Server Management Studio Object Explorer in the Triggers folder. Dicha carpeta se encuentra en la carpeta Server Objects .This folder is located under the Server Objects folder. Los desencadenadores DDL de ámbito de base de datos aparecen en la carpeta Desencadenadores de bases de datos .Database-scoped DDL triggers appear in the Database Triggers folder. Esta carpeta se encuentra en la carpeta Programación de la base de datos correspondiente.This folder is located under the Programmability folder of the corresponding database.

Importante

El código malintencionado de los desencadenadores se puede ejecutar con privilegios concentrados.Malicious code inside triggers can run under escalated privileges. Para obtener más información sobre cómo reducir este riesgo, vea Administrar la seguridad de los desencadenadores.For more information about how to help reduce this threat, see Manage Trigger Security.

Ámbito de desencadenadores DDLDDL Trigger Scope

Los desencadenadores DDL pueden activarse en respuesta a un evento de Transact-SQLTransact-SQL procesado en la base de datos actual o en el servidor actual.DDL triggers can fire in response to a Transact-SQLTransact-SQL event processed in the current database, or on the current server. El ámbito del desencadenador depende del evento.The scope of the trigger depends on the event. 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.For example, a DDL trigger created to fire in response to a CREATE_TABLE event can do so whenever a CREATE_TABLE event occurs in the database, or on the server instance. 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.A DDL trigger created to fire in response to a CREATE_LOGIN event can do so only when a CREATE_LOGIN event occurs in the server instance.

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.In the following example, DDL trigger safety will fire whenever a DROP_TABLE or ALTER_TABLE event occurs in the database.

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.In the following example, a DDL trigger prints a message if any CREATE_DATABASE event occurs on the current server instance. El ejemplo usa la función EVENTDATA para recuperar el texto de la instrucción Transact-SQLTransact-SQL correspondiente.The example uses the EVENTDATA function to retrieve the text of the corresponding Transact-SQLTransact-SQL statement. Para obtener más información sobre el uso de EVENTDATA con desencadenadores DDL, vea Usar la función EVENTDATA.For more information about how to use EVENTDATA with DDL triggers, see Use the EVENTDATA Function.

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-SQLTransact-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".The lists that map the Transact-SQLTransact-SQL statements to the scopes that can be specified for them are available through the links provided in the section "Selecting a Particular DDL Statement to Fire a DDL Trigger," later in this topic.

Los desencadenadores DDL de ámbito de base de datos se almacenan como objetos en la base de datos donde se crean.Database-scoped DDL triggers are stored as objects in the database in which they are created. 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.DDL triggers can be created in the master database and behave just like those created in user-designed databases. Para obtener información acerca de los desencadenadores DDL, consulte la vista de catálogo sys.triggers .You can obtain information about DDL triggers by querying the sys.triggers catalog view. 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.You can query sys.triggers within the database context in which the triggers are created or by specifying the database name as an identifier, such as master.sys.triggers.

Los desencadenadores DDL de ámbito de servidor se almacenan como objetos en la base de datos maestra .Server-scoped DDL triggers are stored as objects in the master database. 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.However, you can obtain information about server-scoped DDL triggers by querying the sys.server_triggers catalog view in any database context.

Especificar una instrucción o grupo de instrucciones Transact-SQLSpecifying a Transact-SQL Statement or Group of Statements

Seleccionar una instrucción DDL concreta para activar un desencadenador DDLSelecting a Particular DDL Statement to Fire a DDL Trigger

Los desencadenadores DDL se pueden diseñar para activarse después de ejecutar una o varias instrucciones Transact-SQLTransact-SQL determinadas.DDL triggers can be designed to fire after one or more particular Transact-SQLTransact-SQL statements are run. En el anterior ejemplo, el desencadenador safety se activa después de un evento DROP_TABLE o ALTER_TABLE .In the previous example, trigger safety fires after any DROP_TABLE or ALTER_TABLE event. Para obtener una lista de las instrucciones Transact-SQLTransact-SQL que pueden especificarse para activar un desencadenador DDL y el ámbito en el que el desencadenador se puede activar, vea Eventos DDL.For lists of the Transact-SQLTransact-SQL statements that can be specified to fire a DDL trigger, and the scope at which the trigger can fire, see DDL Events.

Seleccionar un grupo predefinido de instrucciones DDL para activar un desencadenador DDLSelecting a Predefined Group of DDL Statements to Fire a DDL Trigger

Los desencadenadores DDL se pueden activar tras la ejecución de un evento de Transact-SQLTransact-SQL que pertenezca a una agrupación predefinida de eventos similares.A DDL trigger can fire after execution of any Transact-SQLTransact-SQL event that belongs to a predefined grouping of similar events. 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.For example, if you want a DDL trigger to fire after any CREATE TABLE, ALTER TABLE, or DROP TABLE statement is run, you can specify FOR DDL_TABLE_EVENTS in the CREATE TRIGGER statement. 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 .After CREATE TRIGGER is run, the events that are covered by an event group are added to the sys.trigger_events catalog view.

En Resultado deSQL Server 2005, 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.In Resultado deSQL Server 2005, if a trigger is created on an event group, sys.trigger_events does not include information about the event group, sys.trigger_events includes information only about the individual events covered by that group. En SQL Server 2008SQL Server 2008 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.In SQL Server 2008SQL Server 2008 and higher, sys.trigger_events persists metadata about the event group on which the triggers is created, and also about the individual events that the event group covers. Por consiguiente, los cambios en los eventos cubiertos por los grupos de eventos en SQL Server 2008SQL Server 2008 y posteriores no se aplican a los desencadenadores DDL creados en los grupos de eventos en Resultado deSQL Server 2005.Therefore, changes to the events that are covered by event groups in SQL Server 2008SQL Server 2008 and higher do not apply to DDL triggers that are created on those event groups in Resultado deSQL 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 DDL Event Groups.For a list of the predefined groups of DDL statements that are available for DDL triggers, the particular statements the event groups cover, and the scopes at which these event groups can be programmed, see DDL Event Groups.

TareaTask TemaTopic
Describe cómo crear, modificar, eliminar o deshabilitar los desencadenadores DDL.Describes how to create, modify, delete or disable DDL triggers. Implementar desencadenadores DDLImplement DDL Triggers
Describe cómo crear un desencadenador DDL de CLR.Describes how to create a CLR DDL trigger. Crear desencadenadores CLRCreate CLR Triggers
Describe cómo devolver información acerca de los desencadenadores DDL.Describes how to return information about DDL triggers. Obtener información acerca de los desencadenadores DDLGet Information About DDL Triggers
Describe cómo devolver información acerca de un evento que activa un desencadenador DDL mediante la función EVENTDATA.Describes how to return information about an event that fires a DDL trigger by using the EVENTDATA function. Usar la función EVENTDATAUse the EVENTDATA Function
Describe cómo administrar la seguridad de los desencadenadores.Describes how to manage trigger security. Administrar la seguridad de los desencadenadoresManage Trigger Security

Vea tambiénSee Also

Desencadenadores DML DML Triggers
Desencadenadores logon Logon Triggers
CREATE TRIGGER (Transact-SQL) CREATE TRIGGER (Transact-SQL)