Partilhar via


ALTERAR TRIGGER (Transact-SQL)

Aplica-se a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceBase de dados SQL no Microsoft Fabric

Modifica a definição de um DML, DDL ou trigger de login que foi anteriormente criado pela instrução CREATE TRIGGER. Os gatilhos são criados usando o CREATE TRIGGER. Podem ser criados diretamente a partir de instruções Transact-SQL ou a partir de métodos de assemblies que são criados no Microsoft .NET Framework common language runtime (CLR) e carregados para uma instância do SQL Server. Para mais informações sobre os parâmetros usados na instrução ALTER TRIGGER, veja CREATE TRIGGER (Transact-SQL).

Transact-SQL convenções de sintaxe

Sintaxe

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

Arguments

schema_name
É o nome do esquema ao qual pertence um disparador DML. Os gatilhos DML são direcionados ao esquema da tabela ou vista onde são criados. schema*_name* é opcional apenas se o disparador DML e a sua tabela ou vista correspondente pertencerem ao esquema padrão. schema_name não pode ser especificado para gatilhos DDL ou de logon.

trigger_name
É o gatilho existente para modificar.

tabela | Visão
É a tabela ou vista onde o disparador DML é executado. Especificar o nome totalmente qualificado da tabela ou vista é opcional.

DATABASE
Aplica o escopo de um gatilho DDL ao banco de dados atual. Se especificado, o gatilho é acionado sempre que event_type ou event_group ocorre no banco de dados atual.

TODO O SERVIDOR
Aplica-se a: SQL Server 2008 (10.0.x) e posterior.

Aplica o escopo de um gatilho DDL ou de logon ao servidor atual. Se especificado, o gatilho é acionado sempre que event_type ou event_group ocorre em qualquer lugar do servidor atual.

COM ENCRIPTAÇÃO
Aplica-se a: SQL Server 2008 (10.0.x) e posterior.

Encripta as entradas sys.syscommentssys.sql_modules que contêm o texto da instrução ALTER TRIGGER. A utilização do WITH ENCRYPTION impede que o gatilho seja publicado como parte da replicação do SQL Server. WITH ENCRYPTION não pode ser especificado para gatilhos CLR.

Observação

Se um trigger for criado usando WITH ENCRYPTION, deve ser especificado novamente na instrução ALTER TRIGGER para que esta opção permaneça ativada.

EXECUTAR COMO
Especifica o contexto de segurança sob o qual o gatilho é executado. Permite-lhe controlar a conta de utilizador que a instância do SQL Server usa para validar permissões em quaisquer objetos de base de dados referenciados pelo gatilho.

Para obter mais informações, consulte Cláusula EXECUTE AS (Transact-SQL).

NATIVE_COMPILATION
Indica que o gatilho é compilado nativamente.

Esta opção é necessária para gatilhos em tabelas com otimização de memória.

SCHEMABINDING
Assegura que as tabelas referenciadas por um trigger não podem ser eliminadas ou alteradas.

Esta opção é necessária para triggers em tabelas otimizadas para memória e não é suportada para triggers em tabelas tradicionais.

DEPOIS
Especifica que o gatilho só é disparado depois de a instrução SQL que disparou ser executada com sucesso. Todas as ações referenciais em cascata e verificações de restrições também devem ter sido bem-sucedidas antes de este gatilho ser ativado.

AFTER é o padrão, se apenas a palavra-chave FOR for especificada.

Os gatilhos DML AFTER podem ser definidos apenas em tabelas.

EM VEZ DE
Especifica que o disparador DML é executado em vez da instrução SQL que disparou, sobrepondo-se assim às ações das instruções que disparam. INSTEAD OF não pode ser especificado para gatilhos DDL ou de logon.

No máximo, pode ser definido um trigger INSTEAD OF por instrução INSERT, UPDATE ou DELETE numa tabela ou vista. No entanto, podes definir vistas em vistas onde cada vista tem o seu próprio gatilho EM VEZ DE.

EM VEZ de triggers não são permitidos em vistas criadas usando a opção COM VERIFICAÇÃO. O SQL Server gera um erro quando um gatilho INSTEAD OF é adicionado a uma vista para a qual foi especificado a opção WITH CHECK. O utilizador deve remover essa opção usando ALTER VIEW antes de definir o gatilho INSTEAD OF.

{ [ APAGAR ] [ , ] [ INSERIR ] [ , ] [ ATUALIZAÇÃO ] } | { [INSERIR ] [ , ] [ ATUALIZAÇÃO ] }
Especifica as instruções de modificação de dados; quando tentadas contra esta tabela ou vista, ativam o disparador DML. Deve ser especificada pelo menos uma opção. Qualquer combinação destas, em qualquer ordem, é permitida na definição de gatilho. Se estiverem especificadas mais do que uma opção, separe as opções com vírgulas.

Para triggers INSTEAD OF, a opção DELETE não é permitida em tabelas que tenham uma relação referencial que especifique uma ação em cascata ON DELETE. De forma semelhante, a opção UPDATE não é permitida em tabelas que tenham uma relação referencial que especifique uma ação em cascata ON UPDATE. Para obter mais informações, consulte ALTER TABLE (Transact-SQL).

event_type
É o nome de um evento Transact-SQL linguagem que, após a execução, faz com que um gatilho DDL seja ativado. Os eventos válidos para gatilhos DDL estão listados em Eventos DDL.

event_group
É o nome de um agrupamento pré-definido de eventos linguísticos Transact-SQL. O disparo DDL é executado após a execução de qualquer evento Transact-SQL língua que pertença a event_group. Os grupos de eventos válidos para gatilhos DDL estão listados em Grupos de Eventos DDL. Depois de terminar a execução do ALTER TRIGGER, event_group também atua como macro, adicionando os tipos de eventos que cobre à vista de catálogo sys.trigger_events.

NÃO SE DESTINA À REPLICAÇÃO
Aplica-se a: SQL Server 2008 (10.0.x) e posterior.

Indica que o gatilho não deve ser executado quando um agente de replicação modifica a tabela envolvida no disparador.

sql_statement
São as condições e ações de gatilho.

Para triggers em tabelas otimizadas para memória, a única sql_statement permitida ao nível superior é um bloco ATOM. O T-SQL permitido dentro do bloco ATOMIC é limitado pelo T-SQL permitido dentro dos procs nativos.

NOME <EXTERNO method_specifier>
Aplica-se a: SQL Server 2008 (10.0.x) e posterior.

Especifica o método de um conjunto a ligar com o gatilho. O método não deve aceitar argumentos e retornar void. class_name deve ser um identificador válido do SQL Server e deve existir como uma classe no assembly com visibilidade de assembly. A classe não pode ser uma classe aninhada.

Observações

Para mais informações sobre o ALTER TRIGGER, consulte Comentários em CREATE TRIGGER (Transact-SQL).

Observação

As opções EXTERNAL_NAME e ON_ALL_SERVER não estão disponíveis numa base de dados contida.

Gatilhos DML

O ALTER TRIGGER suporta visualizações atualizáveis manualmente através de triggers INSTEAD OF em tabelas e vistas. O SQL Server aplica o ALTER TRIGGER da mesma forma para todos os tipos de triggers (AFTER, INSTEAD-OF).

Os primeiros e últimos disparadores AFTER a serem executados numa tabela podem ser especificados usando sp_settriggerorder. Apenas um gatilho de primeiro e um último DEPOIS podem ser especificados numa tabela. Se houver outros gatilhos AFTER na mesma tabela, são executados aleatoriamente.

Se uma instrução ALTER TRIGGER alterar um primeiro ou último disparador, o primeiro ou último atributo definido no gatilho modificado é eliminado, e o valor da ordem deve ser reiniciado usando sp_settriggerorder.

Um gatilho AFTER é executado apenas depois de a instrução SQL que disparou ter sido executada com sucesso. Essa execução bem-sucedida inclui todas as ações em cascata referenciais e verificações de restrição associadas ao objeto atualizado ou excluído. A operação de gatilho AFTER verifica os efeitos da instrução que desencadeia e também todas as ações referenciais em cascata UPDATE e DELETE causadas pela instrução que desencadeia.

Quando uma ação DELETE para uma tabela filha ou referência é o resultado de uma CASCATA numa DELETE da tabela pai, e um trigger INSTEAD OF na DELETE é definido nessa tabela filha, o disparador é ignorado e a ação DELETE é executada.

Gatilhos DDL

Ao contrário dos gatilhos DML, os gatilhos DDL não estão encaminhados para esquemas. Portanto, o OBJECT_ID, OBJECT_NAME, OBJECTPROPERTY e OBJECTPROPERTY(EX) não podem ser usados ao consultar metadados sobre disparadores DDL. Em vez disso, use as exibições de catálogo. Para obter mais informações, consulte Obter informações sobre gatilhos DDL.

Gatilhos de início de sessão

O Azure SQL Database não suporta gatilhos em eventos de logon.

Permissions

Para alterar um disparador DML é necessário obter permissão ALTER na tabela ou vista onde o disparador está definido.

Para alterar um gatilho DDL definido com o âmbito do servidor (EM TODOS OS SERVIDORES) ou um gatilho de logon, é necessário permissão CONTROL SERVER no servidor. Para alterar um disparador DDL definido com o âmbito da base de dados (ON DATABASE) é necessário ALTERAR QUALQUER PERMISSÃO DE DISPARO DDL DE BASE DE DADOS na base de dados atual.

Examples

O exemplo seguinte cria um gatilho DML na AdventureWorks2025 base de dados, que imprime uma mensagem definida pelo utilizador para o cliente quando este tenta adicionar ou alterar dados na SalesPersonQuotaHistory tabela. O gatilho é então modificado para ALTER TRIGGER aplicar o gatilho apenas em INSERT atividades. Este gatilho é útil porque lembra ao utilizador de que deve atualizar ou inserir linhas nesta tabela e também notificar o departamento Compensation.

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  

Ver também

GATILHO DE QUEDA (Transact-SQL)
ATIVAR TRIGGER (Transact-SQL)
DESATIVAR ACIONADOR (Transact-SQL)
EVENTDATA (Transact-SQL)
sp_helptrigger (Transact-SQL)
criar um procedimento armazenado
sp_addmessage (Transact-SQL)
Transações
Obter Informações Sobre os Triggers DML
Obter informações sobre gatilhos DDL
sys.triggers (Transact-SQL)
sys.trigger_events (Transact-SQL)
sys.sql_módulos (Transact-SQL)
sys.assembly_modules (Transact-SQL)
sys.server_triggers (Transact-SQL)
sys.server_trigger_events (Transact-SQL)
sys.server_sql_modules (Transact-SQL)
sys.server_assembly_modules (Transact-SQL)
Fazer alterações de esquemas nas bases de dados de publicação