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

APLICA-SE A: simSQL Server simBanco de Dados SQL do Azure SQL nãoAzure Synapse Analytics (SQL DW) nãoData Warehouse Paralelo APPLIES TO: yesSQL Server yesAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

Modifica a definição de um gatilho DML, DDL ou de logon que foi criado anteriormente pela instrução CREATE TRIGGER.Modifies the definition of a DML, DDL, or logon trigger that was previously created by the CREATE TRIGGER statement. Os gatilhos são criados com o uso de CREATE TRIGGER.Triggers are created by using CREATE TRIGGER. Eles podem ser criados diretamente com base em instruções Transact-SQLTransact-SQL ou em métodos de assemblies criados no CLR (Common Language Runtime) do MicrosoftMicrosoft .NET Framework.NET Framework e carregados em uma instância do 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 obter mais informações sobre os parâmetros usados na instrução ALTER TRIGGER, consulte CREATE TRIGGER (Transact-SQL).For more information about the parameters that are used in the ALTER TRIGGER statement, see CREATE TRIGGER (Transact-SQL).

Ícone de link do tópico Convenções de sintaxe Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxeSyntax

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

ArgumentosArguments

schema_nameschema_name
É o nome do esquema ao qual o gatilho DML pertence.Is the name of the schema to which a DML trigger belongs. Os gatilhos DML são definidos no escopo do esquema da tabela ou na exibição na qual são criados.DML triggers are scoped to the schema of the table or view on which they are created. schema**_name é opcional apenas se o gatilho DML e sua tabela ou exibição correspondente pertencem ao esquema padrão.schema**_name is optional only if the DML trigger and its corresponding table or view belong to the default schema. schema_name não pode ser especificado para gatilhos DDL ou de logon.schema_name cannot be specified for DDL or logon triggers.

trigger_nametrigger_name
É o gatilho existente a ser modificado.Is the existing trigger to modify.

table | viewtable | view
É a tabela ou a exibição na qual o gatilho DML é executado.Is the table or view on which the DML trigger is executed. A especificação do nome totalmente qualificado da tabela ou da exibição é opcional.Specifying the fully-qualified name of the table or view is optional.

DATABASEDATABASE
Aplica o escopo de um gatilho DDL ao banco de dados atual.Applies the scope of a DDL trigger to the current database. Se especificado, o gatilho será disparado sempre que event_type ou event_group ocorrer no banco de dados atual.If specified, the trigger fires whenever event_type or event_group occurs in the current database.

ALL SERVERALL SERVER
Aplica-se a: SQL Server 2008SQL Server 2008 e posterior.Applies to: SQL Server 2008SQL Server 2008 and later.

Aplica o escopo de um gatilho DDL ou de logon ao servidor atual.Applies the scope of a DDL or logon trigger to the current server. Se for especificado, o gatilho será disparado sempre que event_type ou event_group ocorrer em qualquer local no servidor atual.If specified, the trigger fires whenever event_type or event_group occurs anywhere in the current server.

WITH ENCRYPTIONWITH ENCRYPTION
Aplica-se a: SQL Server 2008SQL Server 2008 e posterior.Applies to: SQL Server 2008SQL Server 2008 and later.

Criptografa as entradas sys.syscommentssys.sql_modules que contêm o texto da instrução ALTER TRIGGER.Encrypts the sys.syscommentssys.sql_modules entries that contain the text of the ALTER TRIGGER statement. O uso de WITH ENCRYPTION impede que o gatilho seja publicado como parte da replicação do SQL ServerSQL Server.Using WITH ENCRYPTION prevents the trigger from being published as part of SQL ServerSQL Server replication. WITH ENCRYPTION não pode ser especificado para gatilhos CLR.WITH ENCRYPTION cannot be specified for CLR triggers.

Observação

Se um gatilho for criado com o uso de WITH ENCRYPTION, ele deverá ser especificado novamente na instrução ALTER TRIGGER para que essa opção permaneça ativada.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 o contexto de segurança no qual o gatilho é executado.Specifies the security context under which the trigger is executed. Permite controlar a conta de usuário que a instância do SQL ServerSQL Server usa para validar permissões em objetos de banco de dados referenciados pelo gatilho.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 obter mais informações, veja Cláusula EXECUTE AS (Transact-SQL).For more information, see EXECUTE AS Clause (Transact-SQL).

NATIVE_COMPILATIONNATIVE_COMPILATION
Indica que o gatilho foi compilado nativamente.Indicates that the trigger is natively compiled.

Essa opção é necessária para os gatilhos em tabelas com otimização de memória.This option is required for triggers on memory-optimized tables.

SCHEMABINDINGSCHEMABINDING
Garante que as tabelas referenciadas por um gatilho não possam ser removidas nem alteradas.Ensures that tables that are referenced by a trigger cannot be dropped or altered.

Essa opção é obrigatória para gatilhos em tabelas com otimização de memória e não é compatível com gatilhos em tabelas tradicionais.This option is required for triggers on memory-optimized tables and is not supported for triggers on traditional tables.

AFTERAFTER
Especifica que o gatilho será acionado apenas depois que a instrução SQL disparadora for executada com êxito.Specifies that the trigger is fired only after the triggering SQL statement is executed successfully. Todas as verificações de restrição e ações referenciais em cascata também devem ter obtido êxito antes que este gatilho seja acionado.All referential cascade actions and constraint checks also must have been successful before this trigger fires.

AFTER é o padrão se apenas a palavra-chave FOR for especificada.AFTER is the default, if only the FOR keyword is specified.

Os gatilhos DML AFTER podem ser definidos apenas em tabelas.DML AFTER triggers may be defined only on tables.

INSTEAD OFINSTEAD OF
Especifica que o gatilho DML será executado no lugar da instrução SQL de gatilho, substituindo assim as ações das instruções de gatilho.Specifies that the DML trigger is executed instead of the triggering SQL statement, therefore, overriding the actions of the triggering statements. INSTEAD OF não pode ser especificado para gatilhos DDL ou de logon.INSTEAD OF cannot be specified for DDL or logon triggers.

No máximo, um gatilho INSTEAD OF por instrução INSERT, UPDATE ou DELETE pode ser definido em uma tabela ou exibição.At most, one INSTEAD OF trigger per INSERT, UPDATE, or DELETE statement can be defined on a table or view. Entretanto, você pode definir exibições sobre exibições, onde cada uma tem seu próprio gatilho INSTEAD OF.However, you can define views on views where each view has its own INSTEAD OF trigger.

Os gatilhos INSTEAD OF não são permitidos em exibições criadas com o uso de WITH CHECK OPTION.INSTEAD OF triggers are not allowed on views created by using WITH CHECK OPTION. O SQL ServerSQL Server gera um erro quando um gatilho INSTEAD OF é adicionado a uma exibição para a qual WITH CHECK OPTION foi especificado.SQL ServerSQL Server raises an error when an INSTEAD OF trigger is added to a view for which WITH CHECK OPTION was specified. O usuário deve remover essa opção usando ALTER VIEW antes de definir o gatilho 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 as instruções de modificação de dados que, quando tentadas em relação a esta tabela ou exibição, ativam o gatilho DML.Specifies the data modification statements, when tried against this table or view, activate the DML trigger. É necessário especificar pelo menos uma opção.At least one option must be specified. É permitida qualquer combinação delas em qualquer ordem na definição do gatilho.Any combination of these in any order is allowed in the trigger definition. Se mais de uma opção for especificada, separe-as com vírgulas.If more than one option is specified, separate the options with commas.

Para gatilhos INSTEAD OF, a opção DELETE não é permitida em tabelas que tenham um relacionamento referencial que especifique uma ação ON DELETE em cascata.For INSTEAD OF triggers, the DELETE option is not allowed on tables that have a referential relationship specifying a cascade action ON DELETE. Da mesma maneira, a opção UPDATE não é permitida em tabelas que tenham um relacionamento referencial que especifique uma ação ON UPDATE em cascata.Similarly, the UPDATE option is not allowed on tables that have a referential relationship specifying a cascade action ON UPDATE. Para obter mais informações, veja ALTER TABLE (Transact-SQL).For more information, see ALTER TABLE (Transact-SQL).

event_typeevent_type
É o nome de um evento da linguagem Transact-SQLTransact-SQL que, após a execução, faz com que um gatilho DDL seja acionado.Is the name of a Transact-SQLTransact-SQL language event that, after execution, causes a DDL trigger to fire. Os eventos válidos para gatilhos DDL são listados em Eventos DDL.Valid events for DDL triggers are listed in DDL Events.

event_groupevent_group
É o nome de um agrupamento predefinido de eventos da linguagem Transact-SQLTransact-SQL.Is the name of a predefined grouping of Transact-SQLTransact-SQL language events. O gatilho DDL é disparado após a execução de qualquer evento de linguagem do Transact-SQLTransact-SQL que pertence a event_group.The DDL trigger fires after execution of any Transact-SQLTransact-SQL language event that belongs to event_group. Os grupos de eventos válidos para gatilhos DDL são listados em Grupos de eventos DDL.Valid event groups for DDL triggers are listed in DDL Event Groups. Após a conclusão da execução de ALTER TRIGGER, event_group também atuará como uma macro, adicionando os tipos de evento abrangidos por ele à exibição do 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
Aplica-se a: SQL Server 2008SQL Server 2008 e posterior.Applies to: SQL Server 2008SQL Server 2008 and later.

Indica que o gatilho não deve ser executado quando um agente de replicação modificar a tabela envolvida no gatilho.Indicates that the trigger should not be executed when a replication agent modifies the table involved in the trigger.

sql_statementsql_statement
São as condições e as ações do gatilho.Is the trigger conditions and actions.

Para gatilhos em tabelas com otimização de memória, a única sql_statement permitida no nível superior é um bloco ATOMIC.For triggers on memory-optimized tables, the only sql_statement allowed at the top level is an ATOMIC block. O T-SQL permitido dentro do bloco ATOMIC é limitado pelo T-SQL permitido dentro de procedimentos 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>
Aplica-se a: SQL Server 2008SQL Server 2008 e posterior.Applies to: SQL Server 2008SQL Server 2008 and later.

Especifica o método de um assembly a ser associado ao gatilho.Specifies the method of an assembly to bind with the trigger. O método não deve usar nenhum argumento e deve retornar nulo.The method must take no arguments and return void. class_name deve ser um identificador válido do SQL ServerSQL Server e deve existir como uma classe no assembly com visibilidade do assembly.class_name must be a valid SQL ServerSQL Server identifier and must exist as a class in the assembly with assembly visibility. A classe não pode ser aninhada.The class cannot be a nested class.

RemarksRemarks

Para obter mais informações sobre ALTER TRIGGER, consulte Comentários em CREATE TRIGGER (Transact-SQL).For more information about ALTER TRIGGER, see Remarks in CREATE TRIGGER (Transact-SQL).

Observação

As opções EXTERNAL_NAME e ON_ALL_SERVER não estão disponíveis em um banco de dados independente.The EXTERNAL_NAME and ON_ALL_SERVER options are not available in a contained database.

Gatilhos DMLDML Triggers

ALTER TRIGGER oferece suporte a exibições atualizáveis manualmente por meio de gatilhos INSTEAD OF em tabelas e exibições.ALTER TRIGGER supports manually updatable views through INSTEAD OF triggers on tables and views. O SQL ServerSQL Server aplica ALTER TRIGGER da mesma maneira para todos os tipos de gatilhos (AFTER, INSTEAD-OF).SQL ServerSQL Server applies ALTER TRIGGER the same way for all kinds of triggers (AFTER, INSTEAD-OF).

Os primeiro e o último gatilhos AFTER a serem executados em uma tabela podem ser especificados usando sp_settriggerorder.The first and last AFTER triggers to be executed on a table can be specified by using sp_settriggerorder. Apenas um primeiro e um último gatilho AFTER podem ser especificados em uma tabela.Only one first and one last AFTER trigger can be specified on a table. Se houver outros gatilhos AFTER na mesma tabela, eles serão executados aleatoriamente.If there are other AFTER triggers on the same table, they are randomly executed.

Se uma instrução ALTER TRIGGER alterar um primeiro ou último gatilho, o primeiro ou o último atributo definido no gatilho modificado será descartado e o valor da ordem deverá ser redefinido usando-se 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.

Um gatilho AFTER é executado apenas depois que a instrução SQL disparadora for executada com êxito.An AFTER trigger is executed only after the triggering SQL statement has executed successfully. Essa execução com êxito inclui todas as verificações de restrição e ações referenciais em cascata associadas ao objeto atualizado ou excluído.This successful execution includes all referential cascade actions and constraint checks associated with the object updated or deleted. A operação do gatilho AFTER verifica os efeitos da instrução disparadora e também todas as ações UPDATE e DELETE referenciais em cascata causadas pela instrução disparadora.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.

Quando uma ação DELETE para uma tabela filha ou de referência for o resultado de CASCADE em DELETE da tabela pai e um gatilho INSTEAD OF em DELETE estiver definido nessa tabela filha, o gatilho será ignorado e a ação DELETE será executada.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.

Gatilhos DDLDDL Triggers

Diferentemente dos gatilhos DML, os gatilhos DDL não têm seu escopo definido para esquemas.Unlike DML triggers, DDL triggers are not scoped to schemas. Portanto, não é possível usar OBJECT_ID, OBJECT_NAME, OBJECTPROPERTY e OBJECTPROPERTY(EX) ao consultar metadados sobre gatilhos DDL.Therefore, the OBJECT_ID, OBJECT_NAME, OBJECTPROPERTY, and OBJECTPROPERTY(EX) cannot be used when querying metadata about DDL triggers. Use as exibições do catálogo em vez disso.Use the catalog views instead. Para obter mais informações, veja Obter informações sobre gatilhos DDL.For more information, see Get Information About DDL Triggers.

Gatilhos de logonLogon Triggers

O Banco de Dados SQL do AzureAzure SQL Database não oferece suporte a gatilhos em eventos de logon.Banco de Dados SQL do AzureAzure SQL Database does not support triggers on logon events.

PermissõesPermissions

A alteração de um gatilho DML exige permissão ALTER na tabela ou exibição na qual o gatilho está definido.To alter a DML trigger requires ALTER permission on the table or view on which the trigger is defined.

A alteração de um gatilho DDL definido com escopo no servidor (ON ALL SERVER) ou de um gatilho de logon exige permissão CONTROL SERVER no servidor.To alter a DDL trigger defined with server scope (ON ALL SERVER) or a logon trigger requires CONTROL SERVER permission on the server. A alteração de um gatilho DDL definido com escopo no banco de dados (ON DATABASE) exige permissão ALTER ANY DATABASE DDL TRIGGER no banco de dados atual.To alter a DDL trigger defined with database scope (ON DATABASE) requires ALTER ANY DATABASE DDL TRIGGER permission in the current database.

ExemplosExamples

O exemplo a seguir cria um gatilho DML no banco de dados AdventureWorks 2012, que imprime uma mensagem definida pelo usuário para o cliente quando um usuário tenta adicionar ou alterar dados na tabela 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. Em seguida, o gatilho é modificado usando ALTER TRIGGER para aplicar o gatilho apenas em atividades INSERT.The trigger is then modified by using ALTER TRIGGER to apply the trigger only on INSERT activities. Esse gatilho é útil porque lembra ao usuário que atualiza ou insere linhas nessa tabela que também notifique o 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 TambémSee 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)
Criar um procedimento armazenado Create a Stored Procedure
sp_addmessage (Transact-SQL) sp_addmessage (Transact-SQL)
Transações Transactions
Obter informações sobre gatilhos DML Get Information About DML Triggers
Obter informações sobre gatilhos 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)
Fazer alterações de esquema em bancos de dados de publicaçãoMake Schema Changes on Publication Databases