ALTER TRIGGER (Transact-SQL)ALTER TRIGGER (Transact-SQL)

Se aplica a:Applies to: síSQL ServerSQL Server (todas las versiones admitidas) yesSQL ServerSQL Server (all supported versions) SíAzure SQL DatabaseAzure SQL DatabaseYesAzure SQL DatabaseAzure SQL DatabaseSe aplica a:Applies to: síSQL ServerSQL Server (todas las versiones admitidas) yesSQL ServerSQL Server (all supported versions) SíAzure SQL DatabaseAzure SQL DatabaseYesAzure SQL DatabaseAzure SQL Database

Modifica la definición de un desencadenador logon, DDL o DML creado anteriormente por una instrucción CREATE TRIGGER.Modifies the definition of a DML, DDL, or logon trigger that was previously created by the CREATE TRIGGER statement. Los desencadenadores se crean con CREATE TRIGGER.Triggers are created by using CREATE TRIGGER. Se pueden crear directamente a partir de instrucciones Transact-SQLTransact-SQL o 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.They 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. Para más información sobre los parámetros que se usan en la instrucción ALTER TRIGGER, vea CREATE TRIGGER (Transact-SQL).For more information about the parameters that are used in the ALTER TRIGGER statement, see CREATE TRIGGER (Transact-SQL).

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)  

ALTER TRIGGER schema_name.trigger_name   
ON  ( table | view )   
[ WITH <dml_trigger_option> [ ,...n ] ]  
 ( FOR | AFTER | INSTEAD OF )   
{ [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] }   
[ 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  
  
-- Trigger on an INSERT, UPDATE, or DELETE statement to a table 
-- (DML Trigger on memory-optimized tables)  

ALTER TRIGGER schema_name.trigger_name   
ON  ( table  )   
[ WITH <dml_trigger_option> [ ,...n ] ]  
 ( FOR | AFTER )   
{ [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] }   
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)  
  
ALTER TRIGGER trigger_name   
ON { DATABASE | ALL SERVER }   
[ WITH <ddl_trigger_option> [ ,...n ] ]  
{ FOR | AFTER } { event_type [ ,...n ] | event_group }   
AS { sql_statement [ ; ] | EXTERNAL NAME <method specifier>   
[ ; ] }  
}   
  
<ddl_trigger_option> ::=  
    [ ENCRYPTION ]  
    [ <EXECUTE AS Clause> ]  
  
<method_specifier> ::=  
    assembly_name.class_name.method_name  
  
-- Trigger on a LOGON event (Logon Trigger)  

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 ]  
  
<method_specifier> ::=  
    assembly_name.class_name.method_name  
-- Azure SQL Database Syntax   
-- Trigger on an INSERT, UPDATE, or DELETE statement to a table or view (DML Trigger)   
  
ALTER TRIGGER schema_name. trigger_name   
ON (table | view )   
 [ WITH <dml_trigger_option> [ ,...n ] ]   
 ( FOR | AFTER | INSTEAD OF )   
{ [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] }   
AS { sql_statement [ ; ] [...n ] }   
  
<dml_trigger_option> ::=   
    [ <EXECUTE AS Clause> ]   
  
-- Trigger on a CREATE, ALTER, DROP, GRANT, DENY, REVOKE, or UPDATE statement (DDL Trigger)   
  
ALTER TRIGGER trigger_name   
ON { DATABASE }   
 [ WITH <ddl_trigger_option> [ ,...n ] ]   
{ FOR | AFTER } { event_type [ ,...n ] | event_group }   
AS { sql_statement   
[ ; ] }  
}   
  
<ddl_trigger_option> ::=   
    [ <EXECUTE AS Clause> ]  

Nota

Para ver la sintaxis de Transact-SQL para SQL Server 2014 y versiones anteriores, consulte Versiones anteriores de la documentación.To view Transact-SQL syntax for SQL Server 2014 and earlier, see Previous versions documentation.

ArgumentosArguments

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 es opcional únicamente si el desencadenador DML y su tabla o vista correspondiente pertenecen al esquema predeterminado.schema**_name is optional only if the DML trigger and its corresponding table or view belong to the default schema. schema_name no se puede especificar para los desencadenadores DDL o de inicio de sesión.schema_name cannot be specified for DDL or logon triggers.

trigger_nametrigger_name
Es el desencadenador existente que se va a modificar.Is the existing trigger to modify.

table | viewtable | view
Es la tabla o la vista en que se ejecuta el desencadenador DML.Is the table or view on which the DML trigger is executed. Especificar el nombre completo de la tabla o vista es opcional.Specifying the fully-qualified name of the table or view is optional.

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
Válido para : SQL Server 2008SQL Server 2008 y versiones posteriores.Applies to: SQL Server 2008SQL Server 2008 and later.

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
Válido para : SQL Server 2008SQL Server 2008 y versiones posteriores.Applies to: SQL Server 2008SQL Server 2008 and later.

Cifra las entradas sys.syscomments y sys.sql_modules que contienen el texto de la instrucción ALTER TRIGGER.Encrypts the sys.syscommentssys.sql_modules entries that contain the text of the ALTER 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.

Nota

Si se crea un desencadenador mediante WITH ENCRYPTION, debe volver a especificarse en la instrucción ALTER TRIGGER para que esta opción se mantenga habilitada.If a trigger is created by using WITH ENCRYPTION, it must be specified again in the ALTER TRIGGER statement for this option to remain enabled.

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 la cuenta de usuario que la instancia de SQL ServerSQL Server utiliza para validar los permisos en los objetos de base de datos a los que hace referencia el desencadenador.Enables you to control the user account the instance of SQL ServerSQL Server uses to validate permissions on any database objects that are referenced by the trigger.

Para obtener más información, vea EXECUTE AS (cláusula de Transact-SQL).For more information, see EXECUTE 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
Se garantiza que las tablas a las que un desencadenador hace referencia no se pueden quitar o 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 para memoria y no se admite en desencadenadores de tablas tradicionales.This option is required for triggers on memory-optimized tables and is not supported for triggers on traditional tables.

AFTERAFTER
Especifica que el desencadenador se activa solo después de que se ejecute correctamente la instrucción SQL desencadenadora.Specifies that the trigger is fired only after the triggering SQL statement is executed successfully. También todas las acciones referenciales en cascada y las comprobaciones de restricciones deben ser correctas para que este desencadenador se active.All referential cascade actions and constraint checks also must have been successful before this trigger fires.

AFTER es el valor predeterminado, si se especifica solo la palabra clave FOR.AFTER is the default, if only the FOR keyword is specified.

Los desencadenadores DML AFTER solo pueden definirse en tablas.DML AFTER triggers may be defined only on tables.

INSTEAD OFINSTEAD OF
Especifica que el desencadenador DML se ejecuta en vez de la instrucción SQL desencadenadora, por lo que reemplaza las acciones de esta última.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 pueden utilizar en vistas creadas con WITH CHECK OPTION.INSTEAD OF triggers are not allowed on views created by using WITH CHECK OPTION. SQL ServerSQL Server genera un error cuando se agrega un desencadenador INSTEAD OF a una vista para la que se especificó WITH CHECK OPTION.raises an error when an INSTEAD OF trigger is added to a view for which WITH CHECK OPTION was specified. El usuario debe quitar esta opción por medio ALTER VIEW antes de definir el desencadenador INSTEAD OF.The user must remove that option using ALTER VIEW before defining the INSTEAD OF trigger.

{ [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] } | { [INSERT ] [ , ] [ UPDATE ] }{ [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] } | { [INSERT ] [ , ] [ UPDATE ] }
Especifica las instrucciones de modificación de datos que, cuando se ejecutan en esta tabla o vista, activan el desencadenador DML.Specifies the data modification statements, when tried against this table or view, activate the DML trigger. 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 éstas, en cualquier orden.Any combination of these in any order is allowed in the trigger definition. Si especifica más de una opción, deben separarse con comas.If more than one option is specified, separate the options with commas.

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. Para obtener más información, vea ALTER TABLE (Transact-SQL).For more information, see ALTER TABLE (Transact-SQL).

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. 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
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 evento de lenguaje Transact-SQLTransact-SQL que pertenezca a event_group.The DDL trigger fires after execution 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 ALTER TRIGGER ha terminado de ejecutarse, event_group actúa también como una macro al agregar los tipos de eventos que abarca a la vista de catálogo sys.trigger_events.After ALTER 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
Válido para : SQL Server 2008SQL Server 2008 y versiones posteriores.Applies to: SQL Server 2008SQL Server 2008 and later.

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

sql_statementsql_statement
Son las condiciones y acciones del desencadenador.Is the trigger conditions and actions.

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.

EXTERNAL NAME <method_specifier>EXTERNAL NAME <method_specifier>
Válido para : SQL Server 2008SQL Server 2008 y versiones posteriores.Applies to: SQL Server 2008SQL Server 2008 and later.

Especifica el método de un ensamblado que se enlaza al desencadenador.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. La clase no puede ser anidada.The class cannot be a nested class.

ObservacionesRemarks

Para más información sobre ALTER TRIGGER, vea la sección Comentarios de CREATE TRIGGER (Transact-SQL).For more information about ALTER TRIGGER, see Remarks in CREATE TRIGGER (Transact-SQL).

Nota

Las opciones EXTERNAL_NAME y ON_ALL_SERVER no están disponibles en una base de datos independiente.The EXTERNAL_NAME and ON_ALL_SERVER options are not available in a contained database.

Desencadenadores DMLDML Triggers

ALTER TRIGGER admite vistas que se pueden actualizar manualmente mediante el uso de desencadenadores INSTEAD OF en las tablas y las vistas.ALTER TRIGGER supports manually updatable views through INSTEAD OF triggers on tables and views. SQL ServerSQL Server aplica ALTER TRIGGER de la misma manera para todos los tipos de desencadenadores (AFTER, INSTEAD-OF).applies ALTER TRIGGER the same way for all kinds of triggers (AFTER, INSTEAD-OF).

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 pueden especificar un primer desencadenador y un último desencadenador AFTER en una tabla.Only one first and one last AFTER trigger 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. La operación del desencadenador AFTER comprueba los efectos de la instrucción desencadenadora, así como todas las acciones UPDATE y DELETE referenciales en cascada provocadas por la instrucción desencadenadora.The AFTER trigger operation checks for the effects of the triggering statement and also all referential cascade UPDATE and DELETE actions that are caused by the triggering statement.

Cuando una acción DELETE en una tabla de referencia o secundaria es el resultado de una acción CASCADE de una instrucción DELETE de la tabla principal y el desencadenador INSTEAD OF de DELETE está definido en esta tabla secundaria, el desencadenador se pasa por alto y se ejecuta la acción DELETE.When a DELETE action to a child or referencing table is the result of a CASCADE on a DELETE from the parent table, and an INSTEAD OF trigger on DELETE is defined on that child table, the trigger is ignored and the DELETE action is executed.

Desencadenadores DDLDDL Triggers

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, no se pueden utilizar OBJECT_ID, OBJECT_NAME, OBJECTPROPERTY ni OBJECTPROPERTY(EX) al consultar metadatos acerca de desencadenadores DDL.Therefore, the OBJECT_ID, OBJECT_NAME, OBJECTPROPERTY, and OBJECTPROPERTY(EX) cannot be used when 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.

Desencadenadores logonLogon Triggers

Azure SQL DatabaseAzure SQL Database no admite desencadenadores en eventos de inicio de sesión.does not support triggers on logon events.

PermisosPermissions

Para modificar un desencadenador DML se requiere el permiso ALTER en la tabla o vista en la que se define el desencadenador.To alter a DML trigger requires ALTER permission on the table or view on which the trigger is defined.

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

EjemplosExamples

En el siguiente ejemplo se crea un desencadenador DML en la base de datos AdventureWorks 2012 que imprime para el cliente un mensaje definido por el usuario cuando alguien intenta agregar o cambiar los datos de la tabla SalesPersonQuotaHistory.The following example creates a DML trigger in the AdventureWorks 2012 database, that prints a user-defined message to the client when a user tries to add or change data in the SalesPersonQuotaHistory table. Después, el desencadenador se modifica utilizando ALTER TRIGGER para aplicar el desencadenador solo en las actividades INSERT.The trigger is then modified by using ALTER TRIGGER to apply the trigger only on INSERT activities. Este desencadenador es útil porque recuerda al usuario que actualiza o inserta filas en esta tabla que debe notificar también al departamento Compensation .This trigger is helpful because it reminds the user that updates or inserts rows into this table to also notify the Compensation department.

CREATE TRIGGER Sales.bonus_reminder  
ON Sales.SalesPersonQuotaHistory  
WITH ENCRYPTION  
AFTER INSERT, UPDATE   
AS RAISERROR ('Notify Compensation', 16, 10);  
GO  

-- Now, change the trigger.  
ALTER TRIGGER Sales.bonus_reminder  
ON Sales.SalesPersonQuotaHistory  
AFTER INSERT  
AS RAISERROR ('Notify Compensation', 16, 10);  
GO  

Consulte tambiénSee Also

DROP TRIGGER (Transact-SQL) DROP TRIGGER (Transact-SQL)
ENABLE TRIGGER (Transact-SQL) ENABLE TRIGGER (Transact-SQL)
DISABLE TRIGGER (Transact-SQL) DISABLE TRIGGER (Transact-SQL)
EVENTDATA (Transact-SQL) EVENTDATA (Transact-SQL)
sp_helptrigger (Transact-SQL) sp_helptrigger (Transact-SQL)
Crear un procedimiento almacenado Create a Stored Procedure
sp_addmessage (Transact-SQL) sp_addmessage (Transact-SQL)
Transactions Transactions
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)
Realizar cambios de esquema en bases de datos de publicacionesMake Schema Changes on Publication Databases