CREATE TRIGGER (Transact-SQL)CREATE TRIGGER (Transact-SQL)

ESTE TEMA SE APLICA A:síSQL Server (a partir de 2008)síAzure SQL DatabasenoAzure SQL Data Warehouse noAlmacenamiento de datos paralelos THIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

Crea un desencadenador DML, DDL o logon.Creates a DML, DDL, or logon trigger. Un desencadenador es una clase especial de procedimiento almacenado que se ejecuta automáticamente cuando se produce un evento en el servidor de bases de datos.A trigger is a special kind of stored procedure that automatically executes when an event occurs in the database server. Los desencadenadores DML se ejecutan cuando un usuario intenta modificar datos mediante un evento de lenguaje de manipulación de datos (DML).DML triggers execute when a user tries to modify data through a data manipulation language (DML) event. Los eventos DML son instrucciones INSERT, UPDATE o DELETE de una tabla o vista.DML events are INSERT, UPDATE, or DELETE statements on a table or view. Estos desencadenadores se activan cuando se desencadena cualquier evento válido, con independencia de que las filas de la tabla se vean o no afectadas.These triggers fire when any valid event is fired, regardless of whether or not any table rows are affected. Para más información, consulte DML Triggers.For more information, see DML Triggers.

Los desencadenadores DDL se ejecutan como respuesta a diversos eventos del lenguaje de definición de datos (DDL).DDL triggers execute in response to a variety of data definition language (DDL) events. Estos eventos corresponden principalmente a instrucciones CREATE, ALTER y DROP de Transact-SQLTransact-SQL, y a determinados procedimientos almacenados del sistema que ejecutan operaciones de tipo DDL.These events primarily correspond to Transact-SQLTransact-SQL CREATE, ALTER, and DROP statements, and certain system stored procedures that perform DDL-like operations. Los desencadenadores logon se activan en respuesta al evento LOGON que se genera cuando se establece la sesión de un usuario.Logon triggers fire in response to the LOGON event that is raised when a user sessions is being established. Los desencadenadores pueden crearse directamente desde Transact-SQLTransact-SQL instrucciones o de métodos de ensamblados que se crean en el MicrosoftMicrosoft .NET Framework.NET Framework common language runtime (CLR) y cargados en una instancia de SQL ServerSQL Server.Triggers can be created directly from Transact-SQLTransact-SQL statements or from methods of assemblies that are created in the MicrosoftMicrosoft .NET Framework.NET Framework common language runtime (CLR) and uploaded to an instance of SQL ServerSQL Server. SQL ServerSQL Server permite crear varios desencadenadores para cualquier instrucción específica. allows for creating multiple triggers for any specific statement.

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 mitigar esta amenaza, consulte administrar seguridad de los desencadenadores.For more information on how to mitigate this threat, see Manage Trigger Security.

Nota

La integración de CLR de .NET Framework en SQL Server se describe en este tema.The integration of .NET Framework CLR into SQL Server is discussed in this topic. Integración de CLR no se aplica a la base de datos de SQL Azure.CLR integration does not apply to Azure SQL Database.

Icono de vínculo de tema Convenciones de sintaxis de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxisSyntax

-- SQL Server Syntax  
-- Trigger on an INSERT, UPDATE, or DELETE statement to a table or view (DML Trigger)  

CREATE [ OR ALTER ] TRIGGER [ schema_name . ]trigger_name   
ON { table | view }   
[ WITH <dml_trigger_option> [ ,...n ] ]  
{ FOR | AFTER | INSTEAD OF }   
{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }   
[ WITH APPEND ]  
[ NOT FOR REPLICATION ]   
AS { sql_statement  [ ; ] [ ,...n ] | EXTERNAL NAME <method specifier [ ; ] > }  

<dml_trigger_option> ::=  
    [ ENCRYPTION ]  
    [ EXECUTE AS Clause ]  

<method_specifier> ::=  
    assembly_name.class_name.method_name  
-- SQL Server Syntax  
-- Trigger on an INSERT, UPDATE, or DELETE statement to a 
-- table (DML Trigger on memory-optimized tables)  

CREATE [ OR ALTER ] TRIGGER [ schema_name . ]trigger_name   
ON { table }   
[ WITH <dml_trigger_option> [ ,...n ] ]  
{ FOR | AFTER }   
{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }   
AS { sql_statement  [ ; ] [ ,...n ] }  

<dml_trigger_option> ::=  
    [ NATIVE_COMPILATION ]  
    [ SCHEMABINDING ]  
    [ EXECUTE AS Clause ]  
-- Trigger on a CREATE, ALTER, DROP, GRANT, DENY, 
-- REVOKE or UPDATE statement (DDL Trigger)  

CREATE [ OR ALTER ] TRIGGER trigger_name   
ON { ALL SERVER | DATABASE }   
[ WITH <ddl_trigger_option> [ ,...n ] ]  
{ FOR | AFTER } { event_type | event_group } [ ,...n ]  
AS { sql_statement  [ ; ] [ ,...n ] | EXTERNAL NAME < method specifier >  [ ; ] }  

<ddl_trigger_option> ::=  
    [ ENCRYPTION ]  
    [ EXECUTE AS Clause ]  
-- Trigger on a LOGON event (Logon Trigger)  

CREATE [ OR ALTER ] TRIGGER trigger_name   
ON ALL SERVER   
[ WITH <logon_trigger_option> [ ,...n ] ]  
{ FOR| AFTER } LOGON    
AS { sql_statement  [ ; ] [ ,...n ] | EXTERNAL NAME < method specifier >  [ ; ] }  

<logon_trigger_option> ::=  
    [ ENCRYPTION ]  
    [ EXECUTE AS Clause ]  

SintaxisSyntax

-- Windows Azure SQL Database Syntax   
-- Trigger on an INSERT, UPDATE, or DELETE statement to a table or view (DML Trigger)  

CREATE [ OR ALTER ] TRIGGER [ schema_name . ]trigger_name   
ON { table | view }   
 [ WITH <dml_trigger_option> [ ,...n ] ]   
{ FOR | AFTER | INSTEAD OF }   
{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }   
  AS { sql_statement  [ ; ] [ ,...n ] [ ; ] > }  

<dml_trigger_option> ::=   
        [ EXECUTE AS Clause ]  
-- Windows Azure SQL Database Syntax  
-- Trigger on a CREATE, ALTER, DROP, GRANT, DENY, 
-- REVOKE, or UPDATE STATISTICS statement (DDL Trigger)   

CREATE [ OR ALTER ] TRIGGER trigger_name   
ON { DATABASE }   
 [ WITH <ddl_trigger_option> [ ,...n ] ]   
{ FOR | AFTER } { event_type | event_group } [ ,...n ]   
AS { sql_statement  [ ; ] [ ,...n ]  [ ; ] }  

<ddl_trigger_option> ::=   
    [ EXECUTE AS Clause ]  

ArgumentosArguments

O ALTEROR ALTER
Se aplica a: Azure Base de datos SQLSQL Database, SQL ServerSQL Server (a partir de SQL Server 2016SQL Server 2016 SP1).Applies to: Azure Base de datos SQLSQL Database, SQL ServerSQL Server (starting with SQL Server 2016SQL Server 2016 SP1).

Modifica condicionalmente el desencadenador solo si ya existe.Conditionally alters the trigger only if it already exists.

schema_nameschema_name
Es el nombre del esquema al que pertenece un desencadenador DML.Is the name of the schema to which a DML trigger belongs. Los desencadenadores DML tienen como ámbito el esquema de la tabla o la vista donde se crean.DML triggers are scoped to the schema of the table or view on which they are created. schema_name no se puede especificar para desencadenadores DDL o logon.schema_name cannot be specified for DDL or logon triggers.

trigger_nametrigger_name
Es el nombre del desencadenador.Is the name of the trigger. A trigger_name debe cumplir las reglas de identificadores, salvo que trigger_name no puede comenzar por # o ##.A trigger_name must comply with the rules for identifiers, except that trigger_name cannot start with # or ##.

tabla | vistatable | view
Es la tabla o vista en que se ejecuta el desencadenador DML; algunas veces se denomina tabla del desencadenador o vista del desencadenador.Is the table or view on which the DML trigger is executed and is sometimes referred to as the trigger table or trigger view. Especificar el nombre completo de la tabla o vista es opcional.Specifying the fully qualified name of the table or view is optional. Solo se puede hacer referencia a una vista mediante un desencadenador INSTEAD OF.A view can be referenced only by an INSTEAD OF trigger. No es posible definir desencadenadores DML en tablas temporales locales o globales.DML triggers cannot be defined on local or global temporary tables.

DATABASEDATABASE
Aplica el ámbito de un desencadenador DDL a la base de datos actual.Applies the scope of a DDL trigger to the current database. Si se especifica, el desencadenador se activa cada vez que event_type o event_group se produce en la base de datos actual.If specified, the trigger fires whenever event_type or event_group occurs in the current database.

ALL SERVERALL SERVER
Se aplica a: desde SQL Server 2008SQL Server 2008 hasta SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

Aplica el ámbito de un desencadenador DDL o logon al servidor actual.Applies the scope of a DDL or logon trigger to the current server. Si se especifica, el desencadenador se activa cada vez que event_type o event_group tienen lugar en el servidor actual.If specified, the trigger fires whenever event_type or event_group occurs anywhere in the current server.

WITH ENCRYPTIONWITH ENCRYPTION
Se aplica a: desde SQL Server 2008SQL Server 2008 hasta SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

Ofusca el texto de la instrucción CREATE TRIGGER.Obfuscates the text of the CREATE TRIGGER statement. El uso de WITH ENCRYPTION impide que el desencadenador se publique como parte de la replicación de SQL ServerSQL Server.Using WITH ENCRYPTION prevents the trigger from being published as part of SQL ServerSQL Server replication. WITH ENCRYPTION no se puede especificar para desencadenadores CLR.WITH ENCRYPTION cannot be specified for CLR triggers.

EXECUTE ASEXECUTE AS
Especifica el contexto de seguridad en el que se ejecuta el desencadenador.Specifies the security context under which the trigger is executed. Permite controlar qué cuenta de usuario utiliza la instancia de SQL ServerSQL Server para validar los permisos sobre cualquier objeto de base de datos al que haga referencia el desencadenador.Enables you to control which user account the instance of SQL ServerSQL Server uses to validate permissions on any database objects that are referenced by the trigger.

Esta opción es necesaria para los desencadenadores en tablas optimizadas en memoria.This option is required for triggers on memory-optimized tables.

Para obtener más información, veaEXECUTE AS Clause ( Transact-SQL ) .For more information, seeEXECUTE AS Clause (Transact-SQL).

NATIVE_COMPILATIONNATIVE_COMPILATION
Indica que el desencadenador se compila de forma nativa.Indicates that the trigger is natively compiled.

Esta opción es necesaria para los desencadenadores en tablas optimizadas en memoria.This option is required for triggers on memory-optimized tables.

SCHEMABINDINGSCHEMABINDING
Garantiza que las tablas que hace referencia un desencadenador no se pueden quitar ni modificar.Ensures that tables that are referenced by a trigger cannot be dropped or altered.

Esta opción es necesaria para desencadenadores en tablas optimizadas en memoria y no se admite para los desencadenadores de las tablas tradicionales.This option is required for triggers on memory-optimized tables and is not supported for triggers on traditional tables.

FOR | AFTERFOR | AFTER
AFTER especifica que el desencadenador DML solo se activa cuando todas las operaciones especificadas en la instrucción SQL desencadenadora se han ejecutado correctamente.AFTER specifies that the DML trigger is fired only when all operations specified in the triggering SQL statement have executed successfully. Todas las acciones referenciales en cascada y las comprobaciones de restricciones también deben ser correctas para que este desencadenador se activa.All referential cascade actions and constraint checks also must succeed before this trigger fires.

AFTER es el valor predeterminado cuando solo se especifica la palabra clave FOR.AFTER is the default when FOR is the only keyword specified.

Los desencadenadores AFTER no se pueden definir en las vistas.AFTER triggers cannot be defined on views.

INSTEAD OFINSTEAD OF
Especifica que el desencadenador DML se ejecuta en lugar de la instrucción SQL desencadenadora, por lo tanto, el reemplazo de las acciones de las instrucciones desencadenadoras.Specifies that the DML trigger is executed instead of the triggering SQL statement, therefore, overriding the actions of the triggering statements. INSTEAD OF no se puede especificar para los desencadenadores DDL o logon.INSTEAD OF cannot be specified for DDL or logon triggers.

Como máximo, se puede definir un desencadenador INSTEAD OF por cada instrucción INSERT, UPDATE o DELETE en cada tabla o vista.At most, one INSTEAD OF trigger per INSERT, UPDATE, or DELETE statement can be defined on a table or view. No obstante, en las vistas es posible definir otras vistas que tengan su propio desencadenador INSTEAD OF.However, you can define views on views where each view has its own INSTEAD OF trigger.

Los desencadenadores INSTEAD OF no se permiten en vistas actualizables que usan WITH CHECK OPTION.INSTEAD OF triggers are not allowed on updatable views that use WITH CHECK OPTION. SQL ServerSQL Server genera un error cuando se agrega un desencadenador INSTEAD OF a una vista actualizable para la que se especificó WITH CHECK OPTION. raises an error when an INSTEAD OF trigger is added to an updatable view WITH CHECK OPTION specified. El usuario debe quitar esta opción mediante ALTER VIEW antes de definir el desencadenador INSTEAD OF.The user must remove that option by using ALTER VIEW before defining the INSTEAD OF trigger.

{ [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] } { [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] }
Especifica las instrucciones de modificación de datos que activan el desencadenador DML cuando se intenta en esta tabla o vista.Specifies the data modification statements that activate the DML trigger when it is tried against this table or view. Se debe especificar al menos una opción.At least one option must be specified. En la definición del desencadenador se permite cualquier combinación de estas opciones, en cualquier orden.Any combination of these options in any order is allowed in the trigger definition.

Para los desencadenadores INSTEAD OF, no se permite la opción DELETE en tablas que tengan una relación de integridad referencial que especifica una acción ON DELETE en cascada.For INSTEAD OF triggers, the DELETE option is not allowed on tables that have a referential relationship specifying a cascade action ON DELETE. Tampoco se permite la opción UPDATE en tablas que tengan una relación referencial que especifique una acción ON UPDATE en cascada.Similarly, the UPDATE option is not allowed on tables that have a referential relationship specifying a cascade action ON UPDATE.

WITH APPENDWITH APPEND
Se aplica a: desde SQL Server 2008SQL Server 2008 hasta SQL Server 2008 R2SQL Server 2008 R2.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2008 R2SQL Server 2008 R2.

Especifica que debe agregarse un desencadenador adicional de un tipo existente.Specifies that an additional trigger of an existing type should be added. WITH APPEND no se puede utilizar con desencadenadores INSTEAD OF o cuando se ha declarado AFTER explícitamente.WITH APPEND cannot be used with INSTEAD OF triggers or if AFTER trigger is explicitly stated. WITH APPEND solo se puede utilizar si se especificó FOR (sin INSTEAD OF ni AFTER) por motivos de compatibilidad con versiones anteriores.WITH APPEND can be used only when FOR is specified, without INSTEAD OF or AFTER, for backward compatibility reasons. WITH APPEND no se puede especificar si se ha especificado EXTERNAL NAME (es decir, si el desencadenador es de tipo CLR).WITH APPEND cannot be specified if EXTERNAL NAME is specified (that is, if the trigger is a CLR trigger).

event_typeevent_type
Es el nombre de un evento de lenguaje Transact-SQLTransact-SQL que, después de su ejecución, hace que se active un desencadenador DDL.Is the name of a Transact-SQLTransact-SQL language event that, after execution, causes a DDL trigger to fire. Eventos válidos para los desencadenadores DDL se enumeran en eventos DDL.Valid events for DDL triggers are listed in DDL Events.

event_groupevent_group
Es el nombre de un agrupamiento predefinido de eventos de lenguaje de Transact-SQLTransact-SQL.Is the name of a predefined grouping of Transact-SQLTransact-SQL language events. El desencadenador DDL se activa tras la ejecución de cualquier Transact-SQLTransact-SQL eventos de lenguaje que pertenece a event_group.The DDL trigger fires after execution of any Transact-SQLTransact-SQL language event that belongs to event_group. Grupos de eventos válidos para los desencadenadores DDL se enumeran en grupos de eventos DDL.Valid event groups for DDL triggers are listed in DDL Event Groups.

Después de CREATE TRIGGER ha terminado de ejecutarse, event_group también actúa como una macro agregando los tipos de evento que abarca a la vista de catálogo sys.trigger_events.After the CREATE TRIGGER has finished running, event_group also acts as a macro by adding the event types it covers to the sys.trigger_events catalog view.

NOT FOR REPLICATIONNOT FOR REPLICATION
Se aplica a: desde SQL Server 2008SQL Server 2008 hasta SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

Indica que el desencadenador no debe ejecutarse cuando un agente de replicación modifica la tabla involucrada en el mismo.Indicates that the trigger should not be executed when a replication agent modifies the table that is involved in the trigger.

sql_statementsql_statement
Son las condiciones y acciones del desencadenador.Is the trigger conditions and actions. Las condiciones del desencadenador especifican los criterios adicionales que determinan si los intentos de los eventos DML, DDL o logon hacen que se lleven a cabo las acciones del desencadenador.Trigger conditions specify additional criteria that determine whether the tried DML, DDL, or logon events cause the trigger actions to be performed.

Las acciones del desencadenador especificadas en las instrucciones Transact-SQLTransact-SQL surten efecto cuando se intenta la operación.The trigger actions specified in the Transact-SQLTransact-SQL statements go into effect when the operation is tried.

Los desencadenadores pueden incluir cualquier número y clase de instrucciones Transact-SQLTransact-SQL, con excepciones.Triggers can include any number and kind of Transact-SQLTransact-SQL statements, with exceptions. Para obtener más información, vea la sección Comentarios.For more information, see Remarks. Un desencadenador está diseñado para comprobar o cambiar los datos en base a una instrucción de modificación o definición de datos; no debe devolver datos al usuario.A trigger is designed to check or change data based on a data modification or definition statement; it should not return data to the user. El Transact-SQLTransact-SQL las instrucciones en un desencadenador con frecuencia incluyen lenguaje de control de flujo.The Transact-SQLTransact-SQL statements in a trigger frequently include control-of-flow language.

Los desencadenadores DML usan las tablas lógicas (conceptuales) insertadas y eliminadas.DML triggers use the deleted and inserted logical (conceptual) tables. Son de estructura similar a la tabla en que se define el desencadenador, es decir, la tabla en que se intenta la acción del usuario.They are structurally similar to the table on which the trigger is defined, that is, the table on which the user action is tried. Las tablas insertadas y eliminadas contienen los valores antiguos o nuevos de las filas que pueden modificarse mediante la acción del usuario.The deleted and inserted tables hold the old values or new values of the rows that may be changed by the user action. Por ejemplo, para recuperar todos los valores de la tabla deleted, utilice:For example, to retrieve all values in the deleted table, use:

SELECT * FROM deleted;  

Para obtener más información, consulte utilizar las tablas inserted y deleted.For more information, see Use the inserted and deleted Tables.

Desencadenadores DDL y logon capturar información acerca del evento desencadenador mediante la EVENTDATA ( Transact-SQL ) (función).DDL and logon triggers capture information about the triggering event by using the EVENTDATA (Transact-SQL) function. Para obtener más información, consulte usar la función EVENTDATA.For more information, see Use the EVENTDATA Function.

SQL ServerSQL Serverpermite la actualización de texto, ntext, o imagen desencadenan las columnas a INSTEAD OF en tablas o vistas. allows for the update of text, ntext, or image columns through the INSTEAD OF trigger on tables or views.

Importante

ntext, texto, y imagen tipos de datos se quitará en una versión futura de MicrosoftMicrosoft SQL ServerSQL Server.ntext, text, and image data types will be removed in a future version of MicrosoftMicrosoft SQL ServerSQL Server. Evite su uso en nuevos trabajos de desarrollo y piense en modificar las aplicaciones que los usan actualmente.Avoid using these data types in new development work, and plan to modify applications that currently use them. Use nvarchar(max), varchar(max)y varbinary(max) en su lugar.Use nvarchar(max), varchar(max), and varbinary(max) instead. Desencadenadores tanto AFTER como INSTEAD OF admiten varchar (max), nvarchar (max), y varbinary (max) datos de las tablas inserted y deleted.Both AFTER and INSTEAD OF triggers support varchar(MAX), nvarchar(MAX), and varbinary(MAX) data in the inserted and deleted tables.

Para los desencadenadores en tablas optimizadas en memoria, el único sql_statement permitido en el nivel superior es un bloque ATOMIC.For triggers on memory-optimized tables, the only sql_statement allowed at the top level is an ATOMIC block. El código T-SQL permitido dentro del bloque ATOMIC está limitado por el código T-SQL permitido dentro de los procedimientos nativos.The T-SQL allowed inside the ATOMIC block is limited by the T-SQL allowed inside native procs.

<method_specifier > se aplica a: SQL Server 2008SQL Server 2008 a través de SQL Server 2017SQL Server 2017.< method_specifier > Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

En el caso de un desencadenador CLR, especifica el método de enlace de un ensamblado con el desencadenador.For a CLR trigger, specifies the method of an assembly to bind with the trigger. El método no debe tomar argumentos y debe devolver void.The method must take no arguments and return void. CLASS_NAME debe ser válido SQL ServerSQL Server identificador y debe existir como una clase en el ensamblado con visibilidad de ensamblado.class_name must be a valid SQL ServerSQL Server identifier and must exist as a class in the assembly with assembly visibility. Si la clase tiene un nombre calificado como espacio de nombres que utiliza '.' para separar las partes del espacio de nombres, el nombre de la clase debe estar delimitado por delimitadores de tipo [ ] o " ".If the class has a namespace-qualified name that uses '.' to separate namespace parts, the class name must be delimited by using [ ] or " " delimiters. La clase no puede ser anidada.The class cannot be a nested class.

Nota

De manera predeterminada, la capacidad de SQL ServerSQL Server de ejecutar código CLR está desactivada.By default, the ability of SQL ServerSQL Server to run CLR code is off. Puede crear, modificar y quitar objetos de base de datos que hagan referencia a módulos de código administrado, pero estas referencias no se ejecutarán en una instancia de SQL ServerSQL Server a menos que la clr enabled (opción) se habilita mediante sp_ configurar.You can create, modify, and drop database objects that reference managed code modules, but these references will not execute in an instance of SQL ServerSQL Server unless the clr enabled Option is enabled by using sp_configure.

Desencadenadores DML de comentariosRemarks DML Triggers

Los desencadenadores DML se usan con frecuencia para aplicar las reglas de negocios y la integridad de datos.DML triggers are frequently used for enforcing business rules and data integrity. SQL ServerSQL Server proporciona integridad referencial declarativa (DRI) mediante las instrucciones ALTER TABLE y CREATE TABLE. provides declarative referential integrity (DRI) through the ALTER TABLE and CREATE TABLE statements. Sin embargo, DRI no proporciona integridad referencial entre bases de datos.However, DRI does not provide cross-database referential integrity. La integridad referencial se refiere a las reglas acerca de la relación entre la clave principal y la clave externa de las tablas.Referential integrity refers to the rules about the relationships between the primary and foreign keys of tables. Para exigir la integridad referencial, utilice las restricciones de tipo PRIMARY KEY y FOREIGN KEY en ALTER TABLE y CREATE TABLE.To enforce referential integrity, use the PRIMARY KEY and FOREIGN KEY constraints in ALTER TABLE and CREATE TABLE. Si existen restricciones en la tabla de desencadenadores, se comprueban después de la ejecución del desencadenador INSTEAD OF y antes de la de AFTER.If constraints exist on the trigger table, they are checked after the INSTEAD OF trigger execution and before the AFTER trigger execution. Si se infringen las restricciones, se revierten las acciones del desencadenador INSTEAD OF y el desencadenador AFTER no se ejecuta.If the constraints are violated, the INSTEAD OF trigger actions are rolled back and the AFTER trigger is not fired.

El primer y último desencadenador AFTER que se ejecuta en una tabla se puede especificar mediante sp_settriggerorder.The first and last AFTER triggers to be executed on a table can be specified by using sp_settriggerorder. Solo se puede especificar el primer y último desencadenador AFTER para cada una de las operaciones INSERT, UPDATE y DELETE de una tabla.Only one first and one last AFTER trigger for each INSERT, UPDATE, and DELETE operation can be specified on a table. Si hay otros desencadenadores AFTER en la misma tabla, se ejecutan aleatoriamente.If there are other AFTER triggers on the same table, they are randomly executed.

Si una instrucción ALTER TRIGGER modifica el primer o último desencadenador, se elimina el primer o último atributo establecido en el desencadenador modificado, y el valor del orden se debe restablecer mediante sp_settriggerorder.If an ALTER TRIGGER statement changes a first or last trigger, the first or last attribute set on the modified trigger is dropped, and the order value must be reset by using sp_settriggerorder.

Un desencadenador AFTER se ejecuta solo después de ejecutar correctamente la instrucción SQL desencadenadora.An AFTER trigger is executed only after the triggering SQL statement has executed successfully. La ejecución correcta incluye todas las acciones referenciales en cascada y las comprobaciones de restricciones asociadas al objeto actualizado o eliminado.This successful execution includes all referential cascade actions and constraint checks associated with the object updated or deleted. Un desencadenador AFTER no activará de forma recursiva un desencadenador INSTEAD OF en la misma tabla.An AFTER trigger will not recursively fire an INSTEAD OF trigger on the same table.

Si un desencadenador INSTEAD OF definido en una tabla ejecuta una instrucción en la tabla que normalmente volvería a activarlo, al desencadenador no se lo llama de forma recursiva.If an INSTEAD OF trigger defined on a table executes a statement against the table that would ordinarily fire the INSTEAD OF trigger again, the trigger is not called recursively. En su lugar, la instrucción se procesa como si la tabla no tuviera un desencadenador INSTEAD OF e inicia la cadena de operaciones de restricción y ejecuciones de desencadenadores AFTER.Instead, the statement is processed as if the table had no INSTEAD OF trigger and starts the chain of constraint operations and AFTER trigger executions. Por ejemplo, si para una tabla se define un desencadenador como INSTEAD OF INSERT, y éste ejecuta una instrucción INSERT en la misma tabla, la instrucción INSERT ejecutada por el desencadenador INSTEAD OF no vuelve a llamar al desencadenador.For example, if a trigger is defined as an INSTEAD OF INSERT trigger for a table, and the trigger executes an INSERT statement on the same table, the INSERT statement executed by the INSTEAD OF trigger does not call the trigger again. La instrucción INSERT ejecutada por el desencadenador inicia el proceso que realiza las acciones de restricción y activa cualquier desencadenador AFTER INSERT definido para la tabla.The INSERT executed by the trigger starts the process of performing constraint actions and firing any AFTER INSERT triggers defined for the table.

Si un desencadenador INSTEAD OF definido en una vista ejecuta una instrucción en la vista que normalmente volvería a activarlo, no se llamará el desencadenador de forma recursiva.If an INSTEAD OF trigger defined on a view executes a statement against the view that would ordinarily fire the INSTEAD OF trigger again, it is not called recursively. En su lugar, la instrucción se resuelve a modo de modificaciones en las tablas base subyacentes de la vista.Instead, the statement is resolved as modifications against the base tables underlying the view. En este caso, la definición de la vista debe cumplir todas las restricciones para una vista actualizable.In this case, the view definition must meet all the restrictions for an updatable view. Para una definición de vistas actualizables, vea modificar datos mediante una vista.For a definition of updatable views, see Modify Data Through a View.

Por ejemplo, si para una tabla se define un desencadenador como INSTEAD OF UPDATE y éste ejecuta una instrucción UPDATE que hace referencia a la misma vista, la instrucción UPDATE, que ejecuta el desencadenador INSTEAD OF, no vuelve a llamar al desencadenador.For example, if a trigger is defined as an INSTEAD OF UPDATE trigger for a view, and the trigger executes an UPDATE statement referencing the same view, the UPDATE statement executed by the INSTEAD OF trigger does not call the trigger again. La instrucción UPDATE que ejecuta el desencadenador se procesa en la vista, como si ésta no tuviera un desencadenador INSTEAD OF.The UPDATE executed by the trigger is processed against the view as if the view did not have an INSTEAD OF trigger. Las columnas que modifica la instrucción UPDATE deben resolverse en una única tabla base.The columns changed by the UPDATE must be resolved to a single base table. Cada vez que se modifica una tabla base subyacente se inicia la cadena para aplicar restricciones y activar los desencadenadores AFTER definidos para la tabla.Each modification to an underlying base table starts the chain of applying constraints and firing AFTER triggers defined for the table.

Probar las acciones de UPDATE o INSERT en columnas específicasTesting for UPDATE or INSERT Actions to Specific Columns

Se puede diseñar un desencadenador Transact-SQLTransact-SQL que realice determinadas acciones según modificaciones de UPDATE o INSERT en columnas específicas.You can design a Transact-SQLTransact-SQL trigger to perform certain actions based on UPDATE or INSERT modifications to specific columns. Use UPDATE() o COLUMNS_UPDATED en el cuerpo del desencadenador para este propósito.Use UPDATE() or COLUMNS_UPDATED in the body of the trigger for this purpose. UPDATE() comprueba los intentos de UPDATE o INSERT en una columna.UPDATE() tests for UPDATE or INSERT tries on one column. COLUMNS_UPDATED comprueba las acciones de UPDATE o INSERT que se realizaron en varias columnas y devuelve un patrón de bits que indica las columnas que fueron insertadas o actualizadas.COLUMNS_UPDATED tests for UPDATE or INSERT actions that are performed on multiple columns and returns a bit pattern that indicates which columns were inserted or updated.

Limitaciones de los desencadenadoresTrigger Limitations

CREATE TRIGGER debe ser la primera instrucción en el proceso por lotes y solo se puede aplicar a una tabla.CREATE TRIGGER must be the first statement in the batch and can apply to only one table.

Un desencadenador se crea solamente en la base de datos actual; sin embargo, un desencadenador puede hacer referencia a objetos que están fuera de la base de datos actual.A trigger is created only in the current database; however, a trigger can reference objects outside the current database.

Si se especifica el nombre del esquema del desencadenador (para calificar el desencadenador), califique el nombre de la tabla de la misma forma.If the trigger schema name is specified to qualify the trigger, qualify the table name in the same way.

La misma acción del desencadenador puede definirse para más de una acción del usuario (por ejemplo, INSERT y UPDATE) en la misma instrucción CREATE TRIGGER.The same trigger action can be defined for more than one user action (for example, INSERT and UPDATE) in the same CREATE TRIGGER statement.

Los desencadenadores INSTEAD OF DELETE/UPDATE no pueden definirse en una tabla con una clave externa definida en cascada en la acción DELETE/UPDATE.INSTEAD OF DELETE/UPDATE triggers cannot be defined on a table that has a foreign key with a cascade on DELETE/UPDATE action defined.

En un desencadenador se puede especificar cualquier instrucción SET.Any SET statement can be specified inside a trigger. La opción SET seleccionada permanece en efecto durante la ejecución del desencadenador y, después, vuelve a su configuración anterior.The SET option selected remains in effect during the execution of the trigger and then reverts to its former setting.

Cuando se activa un desencadenador, los resultados se devuelven a la aplicación que llama, exactamente igual que con los procedimientos almacenados.When a trigger fires, results are returned to the calling application, just like with stored procedures. Para impedir que se devuelvan resultados a la aplicación debido a la activación de un desencadenador, no incluya las instrucciones SELECT que devuelven resultados ni las instrucciones que realizan una asignación variable en un desencadenador.To prevent having results returned to an application because of a trigger firing, do not include either SELECT statements that return results or statements that perform variable assignment in a trigger. Un desencadenador que incluya instrucciones SELECT que devuelven resultados al usuario o instrucciones que realizan asignaciones de variables requiere un tratamiento especial; estos resultados devueltos tendrían que escribirse en cada aplicación en la que se permiten modificaciones a la tabla del desencadenador.A trigger that includes either SELECT statements that return results to the user or statements that perform variable assignment requires special handling; these returned results would have to be written into every application in which modifications to the trigger table are allowed. Si es preciso que existan asignaciones de variable en un desencadenador, utilice una instrucción SET NOCOUNT al principio del mismo para impedir la devolución de cualquier conjunto de resultados.If variable assignment must occur in a trigger, use a SET NOCOUNT statement at the start of the trigger to prevent the return of any result sets.

Una instrucción TRUNCATE TABLE es de hecho una instrucción DELETE, pero no activa un desencadenador porque la operación no registra eliminaciones de filas individuales.Although a TRUNCATE TABLE statement is in effect a DELETE statement, it does not activate a trigger because the operation does not log individual row deletions. Sin embargo, solo los usuarios con permisos para ejecutar una instrucción TRUNCATE TABLE tienen que ocuparse de cómo sortear un desencadenador de DELETE de esta manera.However, only those users with permissions to execute a TRUNCATE TABLE statement need be concerned about inadvertently circumventing a DELETE trigger this way.

La instrucción WRITETEXT, ya se registre o no, no activa un desencadenador.The WRITETEXT statement, whether logged or unlogged, does not activate a trigger.

Las siguientes instrucciones Transact-SQLTransact-SQL no están permitidas en un desencadenador DML:The following Transact-SQLTransact-SQL statements are not allowed in a DML trigger:

ALTER DATABASEALTER DATABASE CREATE DATABASECREATE DATABASE DROP DATABASEDROP DATABASE
RESTORE DATABASERESTORE DATABASE RESTORE LOGRESTORE LOG RECONFIGURERECONFIGURE

Además, las siguientes instrucciones de Transact-SQLTransact-SQL no se permiten en el cuerpo de un desencadenador DML cuando este se usa en la tabla o la vista que es objeto de la acción desencadenadora.Additionally, the following Transact-SQLTransact-SQL statements are not allowed inside the body of a DML trigger when it is used against the table or view that is the target of the triggering action.

CREATE INDEX (incluidos CREATE SPATIAL INDEX y CREATE XML INDEX)CREATE INDEX (including CREATE SPATIAL INDEX and CREATE XML INDEX) ALTER INDEXALTER INDEX DROP INDEXDROP INDEX
DBCC DBREINDEXDBCC DBREINDEX ALTER PARTITION FUNCTIONALTER PARTITION FUNCTION DROP TABLEDROP TABLE
ALTER TABLE cuando se utiliza para hacer lo siguiente:ALTER TABLE when used to do the following:

Agregar, modificar o quitar columnas.Add, modify, or drop columns.

Cambiar particiones.Switch partitions.

Agregar o quitar restricciones de tipo PRIMARY KEY o UNIQUE.Add or drop PRIMARY KEY or UNIQUE constraints.

Nota

Ya que SQL ServerSQL Server no admite desencadenadores definidos por el usuario en tablas del sistema, se recomienda no crearlos.Because SQL ServerSQL Server does not support user-defined triggers on system tables, we recommend that you do not create user-defined triggers on system tables.

Remarks desencadenadores DDLRemarks DDL Triggers

Los desencadenadores DDL, al igual que los estándar, ejecutan procedimientos almacenados como respuesta a un evento.DDL triggers, like standard triggers, execute stored procedures in response to an event. Pero a diferencia de los desencadenadores estándar, no se ejecutan como respuesta a instrucciones UPDATE, INSERT o DELETE en una tabla o vista.But unlike standard triggers, they do not execute in response to UPDATE, INSERT, or DELETE statements on a table or view. En cambio, se ejecutan principalmente como respuesta a instrucciones de lenguaje de definición de datos (o DDL).Instead, they primarily execute in response to data definition language (DDL) statements. Entre ellas se incluyen instrucciones CREATE, ALTER, DROP, GRANT, DENY, REVOKE y UPDATE STATISTICS.These include CREATE, ALTER, DROP, GRANT, DENY, REVOKE, and UPDATE STATISTICS statements. 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.

Importante

Pruebe los desencadenadores DDL para determinar sus respuestas a la ejecución de los procedimientos almacenados del sistema.Test your DDL triggers to determine their responses to system stored procedure execution. Por ejemplo, la instrucción CREATE TYPE y los procedimientos almacenados sp_addtype y sp_rename activarán un desencadenador DDL creado en un evento CREATE_TYPE.For example, the CREATE TYPE statement and the sp_addtype and sp_rename stored procedures will fire a DDL trigger that is created on a CREATE_TYPE event.

Para obtener más información acerca de los desencadenadores DDL, vea desencadenadores DDL.For more information about DDL triggers, see DDL 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.

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. Para obtener más información, consulte obtener información acerca de los desencadenadores DDL.For more information, see Get Information About DDL Triggers.

Nota

Los desencadenadores DDL con ámbito de servidor aparecen en la SQL Server Management StudioSQL Server Management Studio Explorador de objetos en el desencadenadores carpeta.Server-scoped DDL triggers appear in the SQL Server Management StudioSQL 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. Desencadenadores DDL de ámbito de base de datos aparecen en la desencadenadores de base de datos carpeta.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.

Desencadenadores logonLogon Triggers

Los desencadenadores logon activan procedimientos almacenados en respuesta a un evento LOGON.Logon triggers execute stored procedures in response to a LOGON event. Este evento se genera cuando se establece una sesión de usuario con una instancia de SQL ServerSQL Server.This event is raised when a user session is established with an instance of SQL ServerSQL Server. Los desencadenadores logon se activan después de que termine la fase de autenticación del inicio de sesión, pero antes de que se establezca la sesión de usuario realmente.Logon triggers fire after the authentication phase of logging in finishes, but before the user session is actually established. Por tanto, todos los mensajes que se originan dentro del desencadenador y que normalmente llegarían hasta el usuario, como los mensajes de error y los mensajes de la instrucción PRINT, se desvían al registro de errores de SQL ServerSQL Server .Therefore, all messages originating inside the trigger that would typically reach the user, such as error messages and messages from the PRINT statement, are diverted to the SQL ServerSQL Server error log. Para obtener más información, consulte desencadenadores Logon.For more information, see Logon Triggers.

Los desencadenadores logon no se activan si se produce un error en la autenticación.Logon triggers do not fire if authentication fails.

Los desencadenadores logon no admiten las transacciones distribuidas.Distributed transactions are not supported in a logon trigger. Se devuelve el error 3969 cuando se activa un desencadenador logon que contiene una transacción distribuida.Error 3969 is returned when a logon trigger containing a distributed transaction is fired.

Deshabilitar un desencadenador logonDisabling a Logon Trigger

Un desencadenador LOGON puede evitar la conexión a Motor de base de datosDatabase Engine de todos los usuarios, incluidos los miembros del rol fijo de servidor sysadmin .A logon trigger can effectively prevent successful connections to the Motor de base de datosDatabase Engine for all users, including members of the sysadmin fixed server role. Cuando el desencadenador LOGON evita que se realicen las conexiones, los miembros del rol fijo de servidor sysadmin pueden conectarse mediante la conexión de administrador dedicada o iniciando Motor de base de datosDatabase Engine en modo de configuración mínima (-f).When a logon trigger is preventing connections, members of the sysadmin fixed server role can connect by using the dedicated administrator connection, or by starting the Motor de base de datosDatabase Engine in minimal configuration mode (-f). Para más información, consulte Database Engine Service Startup Options.For more information, see Database Engine Service Startup Options.

Consideraciones generales sobre los desencadenadoresGeneral Trigger Considerations

Devolver resultadosReturning Results

En una versión futura de SQL, se quitará la capacidad de devolver resultados desde los desencadenadores.The ability to return results from triggers will be removed in a future version of SQL Server. Los desencadenadores que devuelven conjuntos de resultados pueden provocar un comportamiento inesperado en aplicaciones que no estén diseñadas para utilizarlos.Triggers that return result sets may cause unexpected behavior in applications that are not designed to work with them. Evite la devolución de conjuntos de resultados desde desencadenadores en los nuevos trabajos de desarrollo y piense en modificar las aplicaciones que la usan actualmente.Avoid returning result sets from triggers in new development work, and plan to modify applications that currently do this. Para evitar que los desencadenadores devuelvan conjuntos de resultados, establezca la no permitir resultados de la opción de desencadenadores en 1.To prevent triggers from returning result sets, set the disallow results from triggers option to 1.

Los desencadenadores LOGON impiden que se devuelvan conjuntos de resultados y este comportamiento no se puede configurar.Logon triggers always disallow results sets to be returned and this behavior is not configurable. Si un desencadenador LOGON genera un conjunto de resultados, no se puede ejecutar y se rechazará el intento de iniciar sesión activado por el desencadenador.If a logon trigger does generate a result set, the trigger fails to execute and the login attempt that fired the trigger is denied.

Desencadenadores múltiplesMultiple Triggers

SQL ServerSQL Server permite que se creen varios desencadenadores para cada evento DML, DDL o LOGON. allows for multiple triggers to be created for each DML, DDL, or LOGON event. Por ejemplo, si se ejecuta CREATE TRIGGER FOR UPDATE para una tabla que ya tiene un desencadenador UPDATE, se creará un desencadenador de actualización adicional.For example, if CREATE TRIGGER FOR UPDATE is executed for a table that already has an UPDATE trigger, an additional update trigger is created. En las versiones anteriores de SQL ServerSQL Server, solo se permitía un desencadenador por cada evento de modificación (INSERT, UPDATE, DELETE) en cada tabla.In earlier versions of SQL ServerSQL Server, only one trigger for each INSERT, UPDATE, or DELETE data modification event is allowed for each table.

Desencadenadores recursivosRecursive Triggers

SQL ServerSQL Server permite también la invocación recursiva de desencadenadores cuando el valor RECURSIVE_TRIGGERS está habilitado mediante ALTER DATABASE. also allows for recursive invocation of triggers when the RECURSIVE_TRIGGERS setting is enabled using ALTER DATABASE.

Los desencadenadores recursivos permiten dos tipos de repetición:Recursive triggers enable the following types of recursion to occur:

  • Recursión indirectaIndirect recursion

    Con la repetición indirecta, una aplicación actualiza la tabla T1.With indirect recursion, an application updates table T1. Así se activa el desencadenador TR1 para actualizar la tabla T2.This fires trigger TR1, updating table T2. En esta situación, el desencadenador T2 activa y actualiza la tabla T1.In this scenario, trigger T2 then fires and updates table T1.

  • Recursión directaDirect recursion

    Con la repetición directa, una aplicación actualiza la tabla T1.With direct recursion, the application updates table T1. Así se activa el desencadenador TR1 para actualizar la tabla T1.This fires trigger TR1, updating table T1. Debido a que la tabla T1 se ha actualizado, el desencadenador TR1 se activa de nuevo, y así sucesivamente.Because table T1 was updated, trigger TR1 fires again, and so on.

    En el ejemplo siguiente se usa la recursividad de desencadenadores directa e indirecta. Suponga que en la tabla T1 se han definido dos desencadenadores de actualización, TR1 y TR2.The following example uses both indirect and direct trigger recursion Assume that two update triggers, TR1 and TR2, are defined on table T1. El desencadenador TR1 actualiza la tabla T1 recursivamente.Trigger TR1 updates table T1 recursively. Una instrucción UPDATE ejecuta cada TR1 y TR2 una vez.An UPDATE statement executes each TR1 and TR2 one time. Además, la ejecución de TR1 desencadena la ejecución de TR1 (recursivamente) y TR2.Additionally, the execution of TR1 triggers the execution of TR1 (recursively) and TR2. Las tablas inserted y deleted de un desencadenador específico contienen filas que corresponden solo a la instrucción UPDATE que invocó al desencadenador.The inserted and deleted tables for a specific trigger contain rows that correspond only to the UPDATE statement that invoked the trigger.

Nota

El comportamiento anterior solo se produce si el valor RECURSIVE_TRIGGERS está habilitado mediante ALTER DATABASE.The previous behavior occurs only if the RECURSIVE_TRIGGERS setting is enabled by using ALTER DATABASE. No hay un orden definido en el que se ejecuten los distintos desencadenadores definidos de un evento específico.There is no defined order in which multiple triggers defined for a specific event are executed. Cada desencadenador debe ser independiente.Each trigger should be self-contained.

Deshabilitar RECURSIVE_TRIGGERS solo evita las recursiones directas.Disabling the RECURSIVE_TRIGGERS setting only prevents direct recursions. Para deshabilitar la repetición indirecta, establezca los desencadenadores anidados opción de servidor en 0 mediante sp_configure.To disable indirect recursion also, set the nested triggers server option to 0 by using sp_configure.

Si alguno de los desencadenadores ejecuta una instrucción ROLLBACK TRANSACTION, no se ejecuta ningún desencadenador posterior, independientemente del nivel de anidamiento.If any one of the triggers performs a ROLLBACK TRANSACTION, regardless of the nesting level, no more triggers are executed.

Desencadenadores anidadosNested Triggers

Los desencadenadores pueden anidarse hasta un máximo de 32 niveles.Triggers can be nested to a maximum of 32 levels. Si un desencadenador cambia una tabla en la que hay otro desencadenador, el segundo se activa y puede, entonces, llamar a un tercero, y así sucesivamente.If a trigger changes a table on which there is another trigger, the second trigger is activated and can then call a third trigger, and so on. Si algún desencadenador de la cadena causa un bucle infinito, el nivel de anidamiento se habrá superado, con lo que se cancela el desencadenador.If any trigger in the chain sets off an infinite loop, the nesting level is exceeded and the trigger is canceled. Cuando un desencadenador Transact-SQLTransact-SQL ejecuta código administrado haciendo referencia a una rutina, un tipo o agregado CLR, esta referencia cuenta como un nivel para el límite de anidamiento de 32 niveles.When a Transact-SQLTransact-SQL trigger executes managed code by referencing a CLR routine, type, or aggregate, this reference counts as one level against the 32-level nesting limit. Los métodos que se invocan desde el código administrado no cuentan para este límite.Methods invoked from within managed code do not count against this limit

Para deshabilitar los desencadenadores anidados, establezca la opción nested triggers de sp_configure en 0 (desactivada).To disable nested triggers, set the nested triggers option of sp_configure to 0 (off). La configuración predeterminada permite desencadenadores anidados.The default configuration allows for nested triggers. Si los desencadenadores anidados están desactivados, los desencadenadores recursivos también se deshabilitan, independientemente del valor de RECURSIVE_TRIGGERS establecido mediante ALTER DATABASE.If nested triggers is off, recursive triggers is also disabled, regardless of the RECURSIVE_TRIGGERS setting set by using ALTER DATABASE.

El primer desencadenador AFTER anidado dentro de un desencadenador INSTEAD OF se desencadena incluso si la desencadenadores anidados opción de configuración del servidor se establece en 0.The first AFTER trigger nested inside an INSTEAD OF trigger fires even if the nested triggers server configuration option is set to 0. Sin embargo, con esta configuración, no se activarán posteriormente los desencadenadores AFTER.However, under this setting, later AFTER triggers do not fire. Se recomienda que revise sus aplicaciones en busca de desencadenadores anidados determinar si las aplicaciones cumplen con sus reglas de negocios en relación con este comportamiento cuando la desencadenadores anidados opción de configuración del servidor se establece en 0, y, a continuación, realice las modificaciones apropiadas.We recommend that you review your applications for nested triggers to determine whether the applications comply with your business rules with regard to this behavior when the nested triggers server configuration option is set to 0, and then make appropriate modifications.

Resolución diferida de nombresDeferred Name Resolution

SQL ServerSQL Server permite que los procedimientos almacenados, los desencadenadores y los procesos por lotes de Transact-SQLTransact-SQL hagan referencia a tablas que no existen en tiempo de compilación. allows for Transact-SQLTransact-SQL stored procedures, triggers, and batches to refer to tables that do not exist at compile time. Esta capacidad se denomina resolución diferida de nombres.This ability is called deferred name resolution.

PermissionsPermissions

Para crear un desencadenador DML, es necesario contar con permiso ALTER sobre la tabla o vista en la que se crea el desencadenador.To create a DML trigger requires ALTER permission on the table or view on which the trigger is being created.

Para crear un desencadenador DDL con ámbito de servidor (ON ALL SERVER) o un desencadenador logon se requiere el permiso CONTROL SERVER en el servidor.To create a DDL trigger with server scope (ON ALL SERVER) or a logon trigger requires CONTROL SERVER permission on the server. Para crear un desencadenador DDL con ámbito en la base de datos (ON DATABASE) es necesario un permiso ALTER ANY DATABASE DDL TRIGGER en la base de datos actual.To create a DDL trigger with database scope (ON DATABASE) requires ALTER ANY DATABASE DDL TRIGGER permission in the current database.

EjemplosExamples

A.A. Usar desencadenador DML con un mensaje de avisoUsing a DML trigger with a reminder message

El siguiente desencadenador DML imprime un mensaje en el cliente cuando alguien intenta agregar o cambiar datos en la tabla Customer de la base de datos AdventureWorks2012AdventureWorks2012.The following DML trigger prints a message to the client when anyone tries to add or change data in the Customer table in the AdventureWorks2012AdventureWorks2012 database.

CREATE TRIGGER reminder1  
ON Sales.Customer  
AFTER INSERT, UPDATE   
AS RAISERROR ('Notify Customer Relations', 16, 10);  
GO  

B.B. Usar un desencadenador DML con un mensaje de correo electrónico de avisoUsing a DML trigger with a reminder e-mail message

Este ejemplo envía un mensaje de correo electrónico a una persona especificada (MaryM) cuando cambia la tabla Customer.The following example sends an e-mail message to a specified person (MaryM) when the Customer table changes.

CREATE TRIGGER reminder2  
ON Sales.Customer  
AFTER INSERT, UPDATE, DELETE   
AS  
   EXEC msdb.dbo.sp_send_dbmail  
        @profile_name = 'AdventureWorks2012 Administrator',  
        @recipients = 'danw@Adventure-Works.com',  
        @body = 'Don''t forget to print a report for the sales force.',  
        @subject = 'Reminder';  
GO  

C.C. Usar un desencadenador DML AFTER para exigir una regla de negocios entre las tablas PurchaseOrderHeader y VendorUsing a DML AFTER trigger to enforce a business rule between the PurchaseOrderHeader and Vendor tables

Debido a que las restricciones CHECK solo pueden hacer referencia a las columnas en las que se han definido las restricciones de columna o de tabla, cualquier restricción entre tablas, en este caso, reglas de negocios, debe definirse como desencadenadores.Because CHECK constraints can reference only the columns on which the column-level or table-level constraint is defined, any cross-table constraints (in this case, business rules) must be defined as triggers.

En el ejemplo siguiente se crea un desencadenador DML en la base de datos AdventureWorks2012.The following example creates a DML trigger in the AdventureWorks2012 database. Este desencadenador se comprueba para asegurarse de que la solvencia del proveedor es satisfactoria (no 5) cuando se intenta insertar un nuevo pedido de compra en la PurchaseOrderHeader tabla.This trigger checks to make sure the credit rating for the vendor is good (not 5) when an attempt is made to insert a new purchase order into the PurchaseOrderHeader table. Para obtener la solvencia del proveedor, debe hacerse referencia a la tabla Vendor.To obtain the credit rating of the vendor, the Vendor table must be referenced. Si la solvencia no es satisfactoria, se obtiene un mensaje y no se ejecuta la inserción.If the credit rating is too low, a message is displayed and the insertion does not execute.

-- This trigger prevents a row from being inserted in the Purchasing.PurchaseOrderHeader 
-- table when the credit rating of the specified vendor is set to 5 (below average).  

CREATE TRIGGER Purchasing.LowCredit ON Purchasing.PurchaseOrderHeader  
AFTER INSERT  
AS  
IF EXISTS (SELECT *  
           FROM Purchasing.PurchaseOrderHeader AS p   
           JOIN inserted AS i   
           ON p.PurchaseOrderID = i.PurchaseOrderID   
           JOIN Purchasing.Vendor AS v   
           ON v.BusinessEntityID = p.VendorID  
           WHERE v.CreditRating = 5  
          )  
BEGIN  
RAISERROR ('A vendor''s credit rating is too low to accept new  
purchase orders.', 16, 1);  
ROLLBACK TRANSACTION;  
RETURN   
END;  
GO  

-- This statement attempts to insert a row into the PurchaseOrderHeader table  
-- for a vendor that has a below average credit rating.  
-- The AFTER INSERT trigger is fired and the INSERT transaction is rolled back.  

INSERT INTO Purchasing.PurchaseOrderHeader (RevisionNumber, Status, EmployeeID,  
VendorID, ShipMethodID, OrderDate, ShipDate, SubTotal, TaxAmt, Freight)  
VALUES (  
2  
,3  
,261  
,1652  
,4  
,GETDATE()  
,GETDATE()  
,44594.55  
,3567.564  
,1114.8638 );  
GO  

D.D. Usar un desencadenador DDL con ámbito de base de datosUsing a database-scoped DDL trigger

En el ejemplo siguiente se usa un desencadenador DDL para impedir que se quiten sinónimos de una base de datos.The following example uses a DDL trigger to prevent any synonym in a database from being dropped.

CREATE TRIGGER safety   
ON DATABASE   
FOR DROP_SYNONYM  
AS   
   RAISERROR ('You must disable Trigger "safety" to drop synonyms!',10, 1)  
   ROLLBACK  
GO  
DROP TRIGGER safety  
ON DATABASE;  
GO  

E.E. Usar un desencadenador DDL con ámbito de servidorUsing a server-scoped DDL trigger

En el ejemplo siguiente se utiliza un desencadenador DDL para imprimir un mensaje si se produce un evento CREATE DATABASE en la instancia actual del servidor, y se utiliza la función EVENTDATA para recuperar el texto de la instrucción Transact-SQLTransact-SQL correspondiente.The following example uses a DDL trigger to print a message if any CREATE DATABASE event occurs on the current server instance, and uses the EVENTDATA function to retrieve the text of the corresponding Transact-SQLTransact-SQL statement. Para obtener más ejemplos que usan EVENTDATA en desencadenadores DDL, vea usar la función EVENTDATA.For more examples that use EVENTDATA in DDL triggers, see Use the EVENTDATA Function.

Se aplica a: desde SQL Server 2008SQL Server 2008 hasta SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

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  

F.F. Usar un desencadenador LOGONUsing a logon trigger

En el siguiente ejemplo de desencadenador logon rechaza un intento de iniciar sesión en SQL ServerSQL Server como un miembro de la login_test si ya hay tres sesiones de usuario que se ejecuta en ese inicio de sesión de inicio de sesión.The following logon trigger example denies an attempt to log in to SQL ServerSQL Server as a member of the login_test login if there are already three user sessions running under that login.

Se aplica a: desde SQL Server 2008SQL Server 2008 hasta SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

USE master;  
GO  
CREATE LOGIN login_test WITH PASSWORD = '3KHJ6dhx(0xVYsdf' MUST_CHANGE,  
    CHECK_EXPIRATION = ON;  
GO  
GRANT VIEW SERVER STATE TO login_test;  
GO  
CREATE TRIGGER connection_limit_trigger  
ON ALL SERVER WITH EXECUTE AS 'login_test'  
FOR LOGON  
AS  
BEGIN  
IF ORIGINAL_LOGIN()= 'login_test' AND  
    (SELECT COUNT(*) FROM sys.dm_exec_sessions  
            WHERE is_user_process = 1 AND  
                original_login_name = 'login_test') > 3  
    ROLLBACK;  
END;  

G.G. Ver los eventos que hacen que se active un desencadenadorViewing the events that cause a trigger to fire

En el ejemplo siguiente se efectúa una consulta en las vistas de catálogo sys.triggers y sys.trigger_events para determinar qué eventos de lenguaje Transact-SQLTransact-SQL hacen que se active el desencadenador safety.The following example queries the sys.triggers and sys.trigger_events catalog views to determine which Transact-SQLTransact-SQL language events cause trigger safety to fire. safety se ha creado en el ejemplo anterior.safety is created in the previous example.

SELECT TE.*  
FROM sys.trigger_events AS TE  
JOIN sys.triggers AS T ON T.object_id = TE.object_id  
WHERE T.parent_class = 0 AND T.name = 'safety';  
GO  

Vea tambiénSee Also

ALTER TABLE (Transact-SQL) ALTER TABLE (Transact-SQL)
ALTER TRIGGER (Transact-SQL) ALTER TRIGGER (Transact-SQL)
COLUMNS_UPDATED ( Transact-SQL ) COLUMNS_UPDATED (Transact-SQL)
CREATE TABLE (Transact-SQL) CREATE TABLE (Transact-SQL)
DROP TRIGGER (Transact-SQL) DROP TRIGGER (Transact-SQL)
ENABLE TRIGGER (Transact-SQL) ENABLE TRIGGER (Transact-SQL)
DISABLE TRIGGER (Transact-SQL) DISABLE TRIGGER (Transact-SQL)
TRIGGER_NESTLEVEL ( Transact-SQL ) TRIGGER_NESTLEVEL (Transact-SQL)
EVENTDATA (Transact-SQL) EVENTDATA (Transact-SQL)
sys.dm_sql_referenced_entities (Transact-SQL) sys.dm_sql_referenced_entities (Transact-SQL)
sys.dm_sql_referencing_entities (Transact-SQL) sys.dm_sql_referencing_entities (Transact-SQL)
sys.sql_expression_dependencies (Transact-SQL) sys.sql_expression_dependencies (Transact-SQL)
sp_help (Transact-SQL) sp_help (Transact-SQL)
sp_helptrigger (Transact-SQL) sp_helptrigger (Transact-SQL)
sp_helptext (Transact-SQL) sp_helptext (Transact-SQL)
sp_rename (Transact-SQL) sp_rename (Transact-SQL)
sp_settriggerorder ( Transact-SQL ) sp_settriggerorder (Transact-SQL)
ACTUALIZACIÓN ( ) ( Transact-SQL ) UPDATE() (Transact-SQL)
Obtener información acerca de los desencadenadores DML Get Information About DML Triggers
Obtener información sobre los desencadenadores DDL Get Information About DDL Triggers
sys.triggers (Transact-SQL) sys.triggers (Transact-SQL)
sys.trigger_events (Transact-SQL) sys.trigger_events (Transact-SQL)
sys.sql_modules (Transact-SQL) sys.sql_modules (Transact-SQL)
sys.assembly_modules (Transact-SQL) sys.assembly_modules (Transact-SQL)
sys.server_triggers (Transact-SQL) sys.server_triggers (Transact-SQL)
sys.server_trigger_events (Transact-SQL) sys.server_trigger_events (Transact-SQL)
sys.server_sql_modules (Transact-SQL) sys.server_sql_modules (Transact-SQL)
sys.server_assembly_modules (Transact-SQL)sys.server_assembly_modules (Transact-SQL)