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

SE APLICA A: síSQL Server síAzure SQL Database noAzure SQL Data Warehouse noAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

Crea un desencadenador DML, DDL o logon.Creates a DML, DDL, or logon trigger. Un desencadenador es un tipo 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 type of stored procedure that automatically runs 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 run 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 fires, whether table rows are affected or not. Para más información, consulte DML Triggers.For more information, see DML Triggers.

Los desencadenadores DDL se ejecutan en respuesta a una variedad de eventos de lenguaje de definición de datos (DDL).DDL triggers run 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's raised when a user's session is being established. Puede crear desencadenadores directamente a partir de instrucciones de Transact-SQLTransact-SQL o de métodos de ensamblados creados en Common Language Runtime (CLR) de MicrosoftMicrosoft .NET Framework.NET Framework y cargados en una instancia de SQL ServerSQL Server.You can create triggers 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.lets you create 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 este riesgo, vea Administrar la seguridad de los desencadenadores.For more information on how to mitigate this threat, see Manage Trigger Security.

Nota

En este artículo se describe la integración de CLR de .NET Framework en SQL Server.The integration of .NET Framework CLR into SQL Server is discussed in this article. La integración de CLR no es válida con Azure SQL Database.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

-- 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 ]  
  
-- 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

OR ALTEROR ALTER
Se aplica a: Azure SQL DatabaseSQL Database, SQL ServerSQL Server (a partir de SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP1).Applies to: Azure SQL DatabaseSQL Database, SQL ServerSQL Server (starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP1).

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

schema_nameschema_name
El nombre del esquema al que pertenece un desencadenador DML.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're created. schema_name no se puede especificar para los desencadenadores DDL o de inicio de sesión.schema_name can't be specified for DDL or logon triggers.

trigger_nametrigger_name
El nombre del desencadenador.The name of the trigger. El parámetro trigger_name debe cumplir las reglas de los identificadores, con la excepción de que trigger_name no puede comenzar con los símbolos # o ##.A trigger_name must follow the rules for identifiers, except that trigger_name can't start with # or ##.

table | viewtable | view
La tabla o la vista en que se ejecuta el desencadenador DML.The table or view on which the DML trigger runs. A veces, se hace referencia a esta tabla o vista como tabla de desencadenador o vista de desencadenador, respectivamente.This table or view 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 puede hacer referencia a una vista mediante un desencadenador INSTEAD OF.You can only reference a view by an INSTEAD OF trigger. No puede definir desencadenadores DML en tablas temporales locales o globales.You can't define DML triggers 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 tienen lugar 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 cualquier lugar del 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.Obscures 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 can't 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 para memoria.This option is required for triggers on memory-optimized tables.

Para obtener más información, vea EXECUTE AS (cláusula de Transact-SQL).For more information, seeEXECUTE AS Clause (Transact-SQL).

NATIVE_COMPILATIONNATIVE_COMPILATION
Indica que el desencadenador está compilado de forma nativa.Indicates that the trigger is natively compiled.

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

SCHEMABINDINGSCHEMABINDING
Garantiza que las tablas a las que un desencadenador hace referencia no se puedan quitar o modificar.Ensures that tables referenced by a trigger can't be dropped or altered.

Esta opción es necesaria para desencadenadores en tablas optimizadas para memoria y no se admite en desencadenadores de tablas tradicionales.This option is required for triggers on memory-optimized tables and isn't 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 iniciado correctamente.AFTER specifies that the DML trigger fires only when all operations specified in the triggering SQL statement have launched successfully. Además, todas las acciones referenciales en cascada y las comprobaciones de restricciones también deben ser correctas para que este desencadenador se active.All referential cascade actions and constraint checks must also 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.

No puede definir desencadenadores AFTER en vistas.You can't define AFTER triggers on views.

INSTEAD OFINSTEAD OF
Especifica que se inicia el desencadenador DML en lugar de la instrucción SQL desencadenadora, por lo que se sobrescriben las acciones de las instrucciones desencadenadoras.Specifies that the DML trigger launches instead of the triggering SQL statement, thus, overriding the actions of the triggering statements. No puede especificar INSTEAD OF para los desencadenadores DDL o LOGON.You can't specify INSTEAD OF for DDL or logon triggers.

Como máximo, puede definir un desencadenador INSTEAD OF por cada instrucción INSERT, UPDATE o DELETE en una tabla o vista.At most, you can define one INSTEAD OF trigger per INSERT, UPDATE, or DELETE statement on a table or view. También puede definir otras vistas en las vistas que tengan su propio desencadenador INSTEAD OF.You can also define views on views where each view has its own INSTEAD OF trigger.

No puede definir desencadenadores INSTEAD OF en vistas actualizables que usan WITH CHECK OPTION.You can't define INSTEAD OF triggers on updatable views that use WITH CHECK OPTION. Al hacerlo, 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.SQL ServerSQL Server Doing so results in an error when an INSTEAD OF trigger is added to an updatable view WITH CHECK OPTION specified. Puede quitar esta opción mediante ALTER VIEW antes de definir el desencadenador INSTEAD OF.You 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's tried against this table or view. Especifique al menos una opción.Specify at least one option. Use cualquier combinación de estas opciones en cualquier orden en la definición del desencadenador.Use any combination of these options in any order in the trigger definition.

Para los desencadenadores INSTEAD OF, no puede utilizar la opción DELETE en tablas que tengan una relación referencial que especifica una acción ON DELETE en cascada.For INSTEAD OF triggers, you can't use the DELETE option 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 especifica una acción ON UPDATE en cascada.Similarly, the UPDATE option isn't 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 declara un desencadenador AFTER de forma explícita.WITH APPEND can't be used with INSTEAD OF triggers or if an AFTER trigger is explicitly stated. Por motivos de compatibilidad con versiones anteriores, use solo WITH APPEND si se especifica FOR, sin INSTEAD OF o AFTER.For backward compatibility, only use WITH APPEND when FOR is specified, without INSTEAD OF or AFTER. No puede especificar WITH APPEND si usa EXTERNAL NAME (es decir, si se trata de un desencadenador CLR).You can't specify WITH APPEND if using EXTERNAL NAME (that is, if the trigger is a CLR trigger).

event_typeevent_type
El nombre de un evento de lenguaje Transact-SQLTransact-SQL que, después del inicio, hace que se active un desencadenador DDL.The name of a Transact-SQLTransact-SQL language event that, after launch, causes a DDL trigger to fire. Los 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
El nombre de un agrupamiento predefinido de eventos de lenguaje Transact-SQLTransact-SQL.The name of a predefined grouping of Transact-SQLTransact-SQL language events. El desencadenador DDL se activa tras el inicio de cualquier evento de lenguaje Transact-SQLTransact-SQL que pertenece a event_group.The DDL trigger fires after launch of any Transact-SQLTransact-SQL language event that belongs to event_group. Los 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.

Una vez que CREATE TRIGGER ha terminado de ejecutarse, event_group también actúa como una macro al agregar los tipos de eventos que comprende 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 shouldn't be run when a replication agent modifies the table that's involved in the trigger.

sql_statementsql_statement
Las condiciones y acciones del desencadenador.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 dan lugar a la ejecución de 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 run.

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 tipo de instrucciones Transact-SQLTransact-SQL, con excepciones.Triggers can include any number and type 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 según 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't return data to the user. Las instrucciones Transact-SQLTransact-SQL de un desencadenador incluyen a menudo 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. Presentan una 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're 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, vea Usar las tablas insertadas y eliminadas.For more information, see Use the inserted and deleted Tables.

Los desencadenadores DDL y logon capturan información acerca del evento desencadenador mediante el uso de la función EVENTDATA (Transact-SQL).DDL and logon triggers capture information about the triggering event by using the EVENTDATA (Transact-SQL) function. Para obtener más información, vea Usar la función EVENTDATA.For more information, see Use the EVENTDATA Function.

SQL ServerSQL Server permite actualizar las columnas text, ntext o image mediante el uso del desencadenador INSTEAD OF en tablas o vistas.allows the update of text, ntext, or image columns through the INSTEAD OF trigger on tables or views.

Importante

Los tipos de datos ntext, text e image se quitarán en una versión futura de MicrosoftMicrosoftSQL ServerSQL Server.ntext, text, and image data types will be removed in a future version of MicrosoftMicrosoftSQL 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. Tanto los desencadenadores AFTER como INSTEAD OF admiten los datos varchar(MAX) , nvarchar(MAX) y varbinary(MAX) en las tablas insertadas y eliminadas.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 para 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: desde SQL Server 2008SQL Server 2008 hasta 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 un identificador válido de SQL ServerSQL Server y debe existir como 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 can't 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 bases de datos que hagan referencia a módulos de código administrados, pero estas referencias no se ejecutarán en una instancia de SQL ServerSQL Server a menos que la opción clr enabled esté habilitada mediante sp_configure.You can create, modify, and drop database objects that reference managed code modules, but these references don't run in an instance of SQL ServerSQL Server unless the clr enabled Option is enabled by using sp_configure.

Comentarios para los desencadenadores DMLRemarks for 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 doesn't 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're checked after the INSTEAD OF trigger runs and before the AFTER trigger runs. Si se infringen las restricciones, se revierten las acciones del desencadenador INSTEAD OF y el desencadenador AFTER no se activa.If the constraints are violated, the INSTEAD OF trigger actions are rolled back and the AFTER trigger isn't fired.

Puede especificar el primer y último desencadenador AFTER que se ejecuta en una tabla mediante sp_settriggerorder.You can specify the first and last AFTER triggers to be run on a table by using sp_settriggerorder. Solo puede especificar el primer y último desencadenador AFTER para cada operación INSERT, UPDATE y DELETE de una tabla.You can specify only one first and one last AFTER trigger for each INSERT, UPDATE, and DELETE operation 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're randomly run.

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 debe restablecer el valor del orden 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 you must reset the order value by using sp_settriggerorder.

Un desencadenador AFTER se ejecuta solo después de ejecutar correctamente la instrucción SQL desencadenadora.An AFTER trigger is run only after the triggering SQL statement has run 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 activa de forma recursiva un desencadenador INSTEAD OF en la misma tabla.An AFTER does 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 le llama de forma recursiva.If an INSTEAD OF trigger defined on a table runs a statement against the table that would ordinarily fire the INSTEAD OF trigger again, the trigger isn't 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 processes as if the table had no INSTEAD OF trigger and starts the chain of constraint operations and AFTER trigger executions. Por ejemplo, si un desencadenador se define como INSTEAD OF INSERT para una tabla.For example, if a trigger is defined as an INSTEAD OF INSERT trigger for a table. Además, el desencadenador ejecuta una instrucción INSERT en la misma tabla, y la instrucción INSERT iniciada por el desencadenador INSTEAD OF no vuelve a llamar al desencadenador.And, the trigger runs an INSERT statement on the same table, the INSERT statement launched by the INSTEAD OF trigger doesn't call the trigger again. La instrucción INSERT iniciada por el desencadenador activa el proceso que ejecuta las acciones de restricción y activa cualquier desencadenador AFTER INSERT definido para la tabla.The INSERT launched by the trigger starts the process of running 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á al desencadenador de forma recursiva.When an INSTEAD OF trigger defined on a view runs a statement against the view that would ordinarily fire the INSTEAD OF trigger again, it's 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 obtener 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 un desencadenador se define como INSTEAD OF UPDATE para una vista.For example, if a trigger is defined as an INSTEAD OF UPDATE trigger for a view. Además, el desencadenador ejecuta una instrucción UPDATE que hace referencia a la misma vista, y la instrucción UPDATE iniciada por el desencadenador INSTEAD OF no vuelve a llamar al desencadenador.And, the trigger runs an UPDATE statement referencing the same view, the UPDATE statement launched by the INSTEAD OF trigger doesn't call the trigger again. La instrucción UPDATE iniciada por el desencadenador se procesa en la vista, como si esta no tuviera un desencadenador INSTEAD OF.The UPDATE launched by the trigger is processed against the view as if the view didn't 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

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 do certain actions based on UPDATE or INSERT modifications to specific columns. Para ello, utilice UPDATE() o COLUMNS_UPDATED en el cuerpo del desencadenador.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 attempts on one column. COLUMNS_UPDATED comprueba las acciones UPDATE o INSERT que se ejecutan en varias columnas.COLUMNS_UPDATED tests for UPDATE or INSERT actions that run on multiple columns. Esta función devuelve un patrón de bits que indica las columnas que se insertaron o se actualizaron.This function 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 can't 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 una 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 de variable en un desencadenador.To prevent results being returned to an application because of a trigger firing, don't include either SELECT statements that return results or statements that carry out variable assignment in a trigger. Un desencadenador que incluye tanto instrucciones SELECT que devuelven resultados al usuario como instrucciones que realizan la asignación de variables requiere un tratamiento especial.A trigger that includes either SELECT statements that return results to the user or statements that do variable assignment, requires special handling. Debería escribir los resultados devueltos en todas las aplicaciones en que se permite modificar la tabla del desencadenador.You'd have to write the returned results 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.

Aunque una instrucción TRUNCATE TABLE es de hecho una instrucción DELETE, 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 doesn't activate a trigger because the operation doesn't log individual row deletions. Sin embargo, solo los usuarios con permisos para ejecutar una instrucción TRUNCATE TABLE tienen que preocuparse de eludir inadvertidamente un desencadenador DELETE de esta manera.However, only those users with permissions to run a TRUNCATE TABLE statement need be concerned about inadvertently circumventing a DELETE trigger this way.

La instrucción WRITETEXT, independientemente de que se registre o no, no activa un desencadenador.The WRITETEXT statement, whether logged or unlogged, doesn't activate a trigger.

Las siguientes instrucciones Transact-SQLTransact-SQL no están permitidas en un desencadenador DML:The following Transact-SQLTransact-SQL statements aren't 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 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 aren't allowed inside the body of a DML trigger when it's used against the table or view that's 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.

Optimización de los desencadenadores DMLOptimizing DML Triggers

Los desencadenadores funcionan en transacciones (implícitas o no) y, mientras están abiertos, bloquean recursos.Triggers work in transactions (implied or otherwise) and while they're open, they lock resources. El bloqueo se mantiene hasta que la transacción se confirma (con COMMIT) o se rechaza (con ROLLBACK).The lock remains in place until the transaction is confirmed (with COMMIT) or rejected (with a ROLLBACK). Cuanto más tiempo se ejecuta un desencadenador, mayor es la probabilidad de que se bloquee otro proceso.The longer a trigger runs, the higher the probability that another process is then blocked. Por lo tanto, escriba desencadenadores para reducir su duración siempre que sea posible.So, write triggers to lessen their duration whenever possible. Una manera de conseguir acortar la duración consiste en liberar un desencadenador cuando una instrucción DML cambia cero filas.One way to achieve shorter duration is to release a trigger when a DML statement changes zero rows.

Para liberar el desencadenador de un comando que no cambia ninguna fila, use la variable del sistema ROWCOUNT_BIG.To release the trigger for a command that doesn't change any rows, employ the system variable ROWCOUNT_BIG.

El fragmento de código T-SQL siguiente muestra cómo liberar el desencadenador de un comando que no cambia ninguna fila.The following T-SQL code snippet shows how to release the trigger for a command that doesn't change any rows. Este código debe estar presente al principio de cada desencadenador DML:This code should be present at the beginning of each DML trigger:

IF (ROWCOUNT_BIG() = 0)
RETURN;

Comentarios para los desencadenadores DDLRemarks for DDL Triggers

Los desencadenadores DDL, al igual que los estándar, inician procedimientos almacenados como respuesta a un evento.DDL triggers, like standard triggers, launch 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 don't run 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 (DDL).Instead, they primarily run in response to data definition language (DDL) statements. Los tipos de instrucciones incluyen CREATE, ALTER, DROP, GRANT, DENY, REVOKE y UPDATE STATISTICS.The statement types include CREATE, ALTER, DROP, GRANT, DENY, REVOKE, and UPDATE STATISTICS. Algunos procedimientos almacenados del sistema que ejecutan operaciones de tipo DDL también pueden activar desencadenadores DDL.Certain system stored procedures that carry out 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 activan un desencadenador DDL creado en un evento CREATE_TYPE.For example, the CREATE TYPE statement and the sp_addtype and sp_rename stored procedures fire a DDL trigger that's created on a CREATE_TYPE event.

Para obtener más información sobre 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 don't 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 aren't scoped to schemas. Por tanto, no puede usar funciones como OBJECT_ID, OBJECT_NAME, OBJECTPROPERTY y OBJECTPROPERTYEX para efectuar consultas en metadatos sobre desencadenadores DDL.So, you can't use functions such as OBJECT_ID, OBJECT_NAME, OBJECTPROPERTY, and OBJECTPROPERTYEX for querying metadata about DDL triggers. Utilice en su lugar las vistas de catálogo.Use the catalog views instead. Para más información, vea Obtener información sobre los desencadenadores DDL.For more information, see Get Information About DDL Triggers.

Nota

Los desencadenadores DDL con ámbito en el servidor aparecen en el Explorador de objetos de SQL Server Management StudioSQL Server Management Studio, en la carpeta Desencadenadores.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. 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.

Desencadenadores logonLogon Triggers

Los desencadenadores LOGON realizan procedimientos almacenados en respuesta a un evento LOGON.Logon triggers carry out 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 happens 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.Logon triggers fire after the authentication phase of logging in finishes, but before the user session is 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.So, 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, vea 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 don't fire if authentication fails.

Los desencadenadores LOGON no admiten las transacciones distribuidas.Distributed transactions aren't supported in a logon trigger. Se devuelve el error 3969 cuando se activa un desencadenador LOGON que contiene una transacción distribuida.Error 3969 returns when a logon trigger that contains a distributed transaction fire.

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 Opciones de inicio del servicio de motor de base de datos.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 aren't 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. Para evitar que los desencadenadores devuelvan conjuntos de resultados, establezca la opción No permitir resultados de desencadenadores en 1.To prevent triggers from returning result sets, set the disallow results from triggers option to 1.

Los desencadenadores LOGON siempre impiden que se devuelvan conjuntos de resultados y este comportamiento no se puede configurar.Logon triggers always disallow the return of results sets and this behavior isn't configurable. Si un desencadenador LOGON genera un conjunto de resultados, no se puede iniciar el desencadenador y se rechaza el intento de inicio de sesión activado por el desencadenador.If a logon trigger generates a result set, the trigger fails to launch and the login attempt that fired the trigger is denied.

Desencadenadores múltiplesMultiple Triggers

SQL ServerSQL Server permite crear varios desencadenadores para cada evento DML, DDL o LOGON.lets you create multiple triggers 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 crea un desencadenador de actualización adicional.For example, if CREATE TRIGGER FOR UPDATE is run 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 también admite la invocación recursiva de desencadenadores cuando el valor RECURSIVE_TRIGGERS está habilitado mediante ALTER DATABASE.also supports 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. El desencadenador T2 activa y actualiza a continuación la tabla T1.Trigger T2 then fires and updates table T1.

  • Recursión directaDirect recursion

    En la recursividad directa, una aplicación actualiza la tabla T1.In 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 runs each TR1 and TR2 one time. Además, el inicio de TR1 desencadena la ejecución de TR1 (recursivamente) y TR2.Additionally, the launch 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 establecido en el que se ejecuten los distintos desencadenadores definidos para un evento específico.There's no defined order in which multiple triggers defined for a specific event are run. 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 la opción de servidor de desencadenadores anidados en 0 con sp_configure.To disable indirect recursion also, set the nested triggers server option to 0 by using sp_configure.

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

Desencadenadores anidadosNested Triggers

Puede anidar desencadenadores hasta un máximo de 32 niveles.You can nest triggers 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's another trigger, the second trigger activates 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 inicia código administrado haciendo referencia a una rutina, un tipo o agregado CLR, esta referencia cuenta como un nivel en relación con el límite de anidamiento de 32 niveles.When a Transact-SQLTransact-SQL trigger launches 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 invocados desde el código administrado no cuentan para este límite.Methods invoked from within managed code don't 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 admite desencadenadores anidados.The default configuration supports 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 are off, recursive triggers are also disabled, despite the RECURSIVE_TRIGGERS setting that's set by using ALTER DATABASE.

El primer desencadenador AFTER anidado que esté dentro de un desencadenador INSTEAD OF se activará si la opción de configuración del servidor de desencadenadores anidados es 0.The first AFTER trigger nested inside an INSTEAD OF trigger fires even if the nested triggers server configuration option is 0. Sin embargo, con esta configuración, los desencadenadores AFTER posteriores no se activarán.But, under this setting, the later AFTER triggers don't fire. Revise las aplicaciones en busca de desencadenadores anidados para determinar si las aplicaciones siguen las reglas de negocio cuando la configuración del servidor de desencadenadores anidados está establecida en 0.Review your applications for nested triggers to determine if the applications follow your business rules when the nested triggers server configuration option is set to 0. Si no es así, realice las modificaciones apropiadas.If not, make the 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 don't exist at compile time. Esta capacidad se denomina resolución diferida de nombres.This ability is called deferred name resolution.

PermisosPermissions

Para crear un desencadenador DML, es necesario contar con permiso ALTER en la tabla o vista en la que se crea el desencadenador.To create a DML trigger, it 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 hacen referencia a las columnas en las que se han definido las restricciones de columna o de tabla, debe definir como desencadenadores cualquier restricción entre tablas, en este caso, las reglas de negocio.Because CHECK constraints reference only the columns on which the column-level or table-level constraint is defined, you must define any cross-table constraints (in this case, business rules) 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 comprueba que la solvencia crediticia del proveedor es satisfactoria (no es 5) cuando se intenta insertar un nuevo pedido de compra en la tabla PurchaseOrderHeader.This trigger checks to make sure the credit rating for the vendor is good (not 5) when there's an attempt to insert a new purchase order into the PurchaseOrderHeader table. Para obtener la solvencia crediticia del proveedor, debe hacerse referencia a la tabla Vendor.To get the credit rating of the vendor, the Vendor table must be referenced. Si la solvencia crediticia es demasiado baja, aparece un mensaje y no se ejecuta la inserción.If the credit rating is too low, a message appears and the insertion doesn't happen.

-- 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 (ROWCOUNT_BIG() = 0)
RETURN;
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   
IF (@@ROWCOUNT = 0)
RETURN;
   RAISERROR ('You must disable Trigger "safety" to remove 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

El ejemplo siguiente de desencadenador logon rechaza un intento de iniciar sesión en SQL ServerSQL Server como miembro del inicio de sesión login_test si ya hay tres sesiones de usuario ejecutándose con ese 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. El desencadenador, safety, se crea en el ejemplo "D", encontrado más arriba.The trigger, safety, is created in example 'D', found above.

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  

Consulte 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)
UPDATE() (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)