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

APLICA-SE A: simSQL Server simBanco de Dados SQL do Azure nãoSQL Data Warehouse do Azure nãoParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

Cria um gatilho DML, DDL ou de logon.Creates a DML, DDL, or logon trigger. Um gatilho é um tipo especial de procedimento armazenado executado automaticamente quando um evento ocorre no servidor de banco de dados.A trigger is a special type of stored procedure that automatically runs when an event occurs in the database server. Os gatilhos DML são executados quando um usuário tenta modificar dados por meio de um evento DML (linguagem de manipulação de dados).DML triggers run when a user tries to modify data through a data manipulation language (DML) event. Os eventos DML são instruções INSERT, UPDATE ou DELETE em uma tabela ou exibição.DML events are INSERT, UPDATE, or DELETE statements on a table or view. Esses gatilhos são disparados quando qualquer evento válido é acionado, sejam as linhas da tabela afetadas ou não.These triggers fire when any valid event fires, whether table rows are affected or not. Para obter mais informações, consulte DML Triggers.For more information, see DML Triggers.

Os gatilhos DDL são executados em resposta a diversos eventos DDL (linguagem de definição de dados).DDL triggers run in response to a variety of data definition language (DDL) events. Esses eventos correspondem, basicamente, a instruções Transact-SQLTransact-SQL CREATE, ALTER e DROP e determinados procedimentos armazenados do sistema que executam operações do 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.

Os gatilhos de logon são disparados em resposta ao evento LOGON gerado quando a sessão de um usuário está sendo estabelecida.Logon triggers fire in response to the LOGON event that's raised when a user's session is being established. Crie gatilhos diretamente de instruções Transact-SQLTransact-SQL ou de 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.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. O SQL ServerSQL Server permite criar vários gatilhos para qualquer instrução específica.SQL ServerSQL Server lets you create multiple triggers for any specific statement.

Importante

Um código mal-intencionado dentro de gatilhos pode ser executado sob privilégios escalonados.Malicious code inside triggers can run under escalated privileges. Para obter mais informações sobre como reduzir essa ameaça, veja Gerenciar segurança do gatilho.For more information on how to mitigate this threat, see Manage Trigger Security.

Observação

A integração do CLR do .NET Framework ao SQL Server é discutida neste artigo.The integration of .NET Framework CLR into SQL Server is discussed in this article. A integração CLR não se aplica ao Banco de Dados SQL do Azure.CLR integration does not apply to Azure SQL Database.

Ícone de link do tópico Convenções de sintaxe de 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)  
  
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 ]  
  

SintaxeSyntax

-- 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
Aplica-se ao: Azure Banco de Dados SQLSQL Database, SQL ServerSQL Server (começando pelo SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP1).Applies to: Azure Banco de Dados SQLSQL Database, SQL ServerSQL Server (starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP1).

Altera condicionalmente o gatilho somente se ele já existir.Conditionally alters the trigger only if it already exists.

schema_nameschema_name
O nome do esquema ao qual o gatilho DML pertence.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 em que são criados.DML triggers are scoped to the schema of the table or view on which they're created. schema_name não pode ser especificado para gatilhos DDL ou de logon.schema_name can't be specified for DDL or logon triggers.

trigger_nametrigger_name
O nome do gatilho.The name of the trigger. Um nome_do_gatilho deve seguir as regras de identificadores, exceto que nome_do_gatilho não pode começar com # nem ##.A trigger_name must follow the rules for identifiers, except that trigger_name can't start with # or ##.

table | viewtable | view
A tabela ou a exibição em que o gatilho DML é executado.The table or view on which the DML trigger runs. Essa tabela ou exibição às vezes é referenciada como tabela de gatilho ou exibição de gatilho.This table or view is sometimes referred to as the trigger table or trigger view. Especificar o nome totalmente qualificado da tabela ou da exibição é opcional.Specifying the fully qualified name of the table or view is optional. Só é possível referenciar uma exibição por um gatilho INSTEAD OF.You can only reference a view by an INSTEAD OF trigger. Não é possível definir gatilhos DML em tabelas temporárias locais ou globais.You can't define DML triggers on local or global temporary tables.

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: do SQL Server 2008SQL Server 2008 ao SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

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: do SQL Server 2008SQL Server 2008 ao SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

Obscurece o texto da instrução CREATE TRIGGER.Obscures the text of the CREATE 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 can't be specified for CLR triggers.

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 quaisquer objetos do banco de dados referidos pelo gatilho.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.

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.

Para obter mais informações, veja Cláusula EXECUTE AS (Transact-SQL).For more information, seeEXECUTE 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 referenced by a trigger can't 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 isn't supported for triggers on traditional tables.

FOR | AFTERFOR | AFTER
AFTER especifica que o gatilho DML é disparado apenas quando todas as operações especificadas na instrução SQL de gatilho são iniciadas com êxito.AFTER specifies that the DML trigger fires only when all operations specified in the triggering SQL statement have launched successfully. Todas as verificações de restrição e ações referenciais em cascata também devem ter êxito para que esse gatilho seja disparado.All referential cascade actions and constraint checks must also succeed before this trigger fires.

AFTER é o padrão quando FOR é a única palavra-chave especificada.AFTER is the default when FOR is the only keyword specified.

Não é possível definir gatilhos AFTER em exibições.You can't define AFTER triggers on views.

INSTEAD OFINSTEAD OF
Especifica que o gatilho DML será iniciado em vez da instrução SQL de gatilho, substituindo as ações das instruções de gatilho.Specifies that the DML trigger launches instead of the triggering SQL statement, thus, overriding the actions of the triggering statements. Não é possível especificar INSTEAD OF para gatilhos DDL ou de logon.You can't specify INSTEAD OF for DDL or logon triggers.

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

Não é possível definir gatilhos INSTEAD OF em exibições atualizáveis que usam WITH CHECK OPTION.You can't define INSTEAD OF triggers on updatable views that use WITH CHECK OPTION. SQL ServerSQL Server Fazer isso gera um erro quando um gatilho INSTEAD OF é adicionado a uma WITH CHECK OPTION de exibição atualizável especificada.Doing so results in an error when an INSTEAD OF trigger is added to an updatable view WITH CHECK OPTION specified. Remova essa opção usando ALTER VIEW antes de definir o gatilho INSTEAD OF.You remove that option by using ALTER VIEW before defining the INSTEAD OF trigger.

{ [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] }{ [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] }
Especifica as instruções de modificação de dados que, quando tentadas nessa tabela ou exibição, ativam o gatilho DML.Specifies the data modification statements that activate the DML trigger when it's tried against this table or view. Especifique pelo menos uma opção.Specify at least one option. Use qualquer combinação dessas opções em qualquer ordem na definição do gatilho.Use any combination of these options in any order in the trigger definition.

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, you can't use the DELETE option 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 isn't allowed on tables that have a referential relationship, specifying a cascade action ON UPDATE.

WITH APPENDWITH APPEND
Aplica-se a: do SQL Server 2008SQL Server 2008 ao SQL Server 2008 R2SQL Server 2008 R2.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2008 R2SQL Server 2008 R2.

Especifica que um gatilho adicional de um tipo existente deve ser adicionado.Specifies that an additional trigger of an existing type should be added. WITH APPEND não poderá ser usado com gatilhos INSTEAD OF ou se o gatilho AFTER for explicitamente declarado.WITH APPEND can't be used with INSTEAD OF triggers or if an AFTER trigger is explicitly stated. Por razões de compatibilidade com versões anteriores, WITH APPEND só pode ser usado quando FOR é especificado, sem INSTEAD OF ou AFTER.For backward compatibility, only use WITH APPEND when FOR is specified, without INSTEAD OF or AFTER. Não será possível especificar WITH APPEND se EXTERNAL NAME for usado (ou seja, se o gatilho for um gatilho CLR).You can't specify WITH APPEND if using EXTERNAL NAME (that is, if the trigger is a CLR trigger).

event_typeevent_type
O nome de um evento da linguagem Transact-SQLTransact-SQL que, após a inicialização, faz com que um gatilho DDL seja acionado.The name of a Transact-SQLTransact-SQL language event that, after launch, 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.The name of a predefined grouping of Transact-SQLTransact-SQL language events. O gatilho DDL é disparado após a inicialização de qualquer evento de linguagem do Transact-SQLTransact-SQL que pertence a event_group.The DDL trigger fires after launch 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.

Depois que a execução de CREATE TRIGGER for concluída, o event_group também atuará como uma macro pela adição dos tipos de evento abrangidos por ele à exibição do 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
Aplica-se a: do SQL Server 2008SQL Server 2008 ao SQL Server 2017SQL Server 2017.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

Indica que o gatilho não deve ser executado quando um agente de replicação modifica a tabela envolvida no gatilho.Indicates that the trigger shouldn't be run when a replication agent modifies the table that's involved in the trigger.

sql_statementsql_statement
As condições e as ações do gatilho.The trigger conditions and actions. As condições de gatilho especificam critérios adicionais que determinam se os eventos DML, DDL ou de logon fazem com que as ações de gatilho sejam executadas.Trigger conditions specify additional criteria that determine whether the tried DML, DDL, or logon events cause the trigger actions to be run.

As ações de gatilho especificadas nas instruções Transact-SQLTransact-SQL entram em vigor quando a operação é tentada.The trigger actions specified in the Transact-SQLTransact-SQL statements go into effect when the operation is tried.

Os gatilhos podem incluir qualquer número e tipo de instruções Transact-SQLTransact-SQL, com exceções.Triggers can include any number and type of Transact-SQLTransact-SQL statements, with exceptions. Para obter mais informações, consulte Comentários.For more information, see Remarks. Um gatilho é criado para verificar ou alterar dados com base em uma instrução de definição ou modificação de dados. Ele não deve retornar dados ao usuário.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. As instruções Transact-SQLTransact-SQL em um gatilho frequentemente incluem linguagem de controle de fluxo.The Transact-SQLTransact-SQL statements in a trigger frequently include control-of-flow language.

Gatilhos de DML usam as tabelas (conceituais) lógicas inseridas e excluídas.DML triggers use the deleted and inserted logical (conceptual) tables. Eles são estruturalmente semelhantes à tabela em que o gatilho é definido, ou seja, a tabela em que a ação do usuário é tentada.They're structurally similar to the table on which the trigger is defined, that is, the table on which the user action is tried. As tabelas excluídas e inseridas contêm os valores antigos ou novos das linhas que podem ser alteradas pela ação do usuário.The deleted and inserted tables hold the old values or new values of the rows that may be changed by the user action. Por exemplo, para recuperar todos os valores na tabela deleted, use:For example, to retrieve all values in the deleted table, use:

SELECT * FROM deleted;  

Para obter mais informações, veja Usar as tabelas inseridas e excluídas.For more information, see Use the inserted and deleted Tables.

Gatilhos DDL e logon capturam informações sobre o evento de gatilho usando a função EVENTDATA (Transact-SQL).DDL and logon triggers capture information about the triggering event by using the EVENTDATA (Transact-SQL) function. Para obter mais informações, veja Usar a função EVENTDATA.For more information, see Use the EVENTDATA Function.

O SQL ServerSQL Server permite a atualização das colunas text, ntext ou image por meio do gatilho INSTEAD OF em tabelas ou exibições.SQL ServerSQL Server allows the update of text, ntext, or image columns through the INSTEAD OF trigger on tables or views.

Importante

Os tipos de dados ntext, text e image serão removidos em uma versão futura do MicrosoftMicrosoftSQL ServerSQL Server.ntext, text, and image data types will be removed in a future version of MicrosoftMicrosoftSQL ServerSQL Server. Evite usar esses tipos de dados em novos trabalhos de desenvolvimento e planeje modificar os aplicativos que os utilizam atualmente.Avoid using these data types in new development work, and plan to modify applications that currently use them. Em vez disso, use nvarchar(max), varchar(max)e varbinary(max) .Use nvarchar(max), varchar(max), and varbinary(max) instead. Os gatilhos AFTER e INSTEAD OF dão ambos suporte a dados varchar(MAX) , nvarchar(MAX) e varbinary(MAX) nas tabelas inseridas e excluídas.Both AFTER and INSTEAD OF triggers support varchar(MAX), nvarchar(MAX), and varbinary(MAX) data in the inserted and deleted tables.

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.

< method_specifier > Aplica-se a: SQL Server 2008SQL Server 2008 a SQL Server 2017SQL Server 2017.< method_specifier > Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017.

Para um gatilho CLR, especifica o método de associação de um assembly ao gatilho.For a CLR trigger, 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. Se a classe tiver um nome qualificado de namespace que use '.' para separar partes do namespace, o nome da classe deverá ser delimitado com [ ] ou " ".If the class has a namespace-qualified name that uses '.' to separate namespace parts, the class name must be delimited by using [ ] or " " delimiters. A classe não pode ser aninhada.The class can't be a nested class.

Observação

Por padrão, a capacidade do SQL ServerSQL Server em executar código CLR está desligada.By default, the ability of SQL ServerSQL Server to run CLR code is off. Você pode criar, modificar e remover objetos do banco de dados que referenciam módulos de código gerenciado, mas essas referências não são executadas em uma instância do SQL ServerSQL Server, a menos que a Opção clr enabled seja habilitada usando 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.

Comentários para gatilhos DMLRemarks for DML Triggers

Os gatilhos DML são usados com frequência para impor as regras de negócio e a integridade dos dados.DML triggers are frequently used for enforcing business rules and data integrity. O SQL ServerSQL Server fornece DRI (declarative referential integrity, integridade referencial declarativa) por meio das instruções ALTER TABLE e CREATE TABLE.SQL ServerSQL Server provides declarative referential integrity (DRI) through the ALTER TABLE and CREATE TABLE statements. Entretanto, DRI não fornece integridade referencial em todos os bancos de dados.However, DRI doesn't provide cross-database referential integrity. A integridade referencial refere-se às regras sobre as relações entre as chaves primárias e estrangeiras de tabelas.Referential integrity refers to the rules about the relationships between the primary and foreign keys of tables. Para impor a integridade referencial, use as restrições PRIMARY KEY e FOREIGN KEY em ALTER TABLE e CREATE TABLE.To enforce referential integrity, use the PRIMARY KEY and FOREIGN KEY constraints in ALTER TABLE and CREATE TABLE. Se houver restrições na tabela de gatilhos, elas serão verificadas após a execução do gatilho INSTEAD OF e antes da execução do gatilho AFTER.If constraints exist on the trigger table, they're checked after the INSTEAD OF trigger runs and before the AFTER trigger runs. Se as restrições forem violadas, as ações do gatilho INSTEAD OF serão revertidas e o gatilho AFTER não será disparado.If the constraints are violated, the INSTEAD OF trigger actions are rolled back and the AFTER trigger isn't fired.

É possível especificar o primeiro e o último gatilhos AFTER a serem executados em uma tabela usando sp_settriggerorder.You can specify the first and last AFTER triggers to be run on a table by using sp_settriggerorder. Só é possível especificar um primeiro e um último gatilho AFTER para cada operação INSERT, UPDATE e DELETE em uma tabela.You can specify only one first and one last AFTER trigger for each INSERT, UPDATE, and DELETE operation 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're randomly run.

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 você terá que redefinir o valor da ordem usando 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.

Um gatilho AFTER é executado apenas depois que a instrução SQL disparadora é executada com êxito.An AFTER trigger is run only after the triggering SQL statement has run 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. Um gatilho AFTER não aciona recursivamente um gatilho INSTEAD OF na mesma tabela.An AFTER does not recursively fire an INSTEAD OF trigger on the same table.

Se um gatilho INSTEAD OF definido em uma tabela executar uma instrução na tabela que em geral acionaria o gatilho INSTEAD OF novamente, o gatilho não será chamado de forma recorrente.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. Em vez disso, a instrução será processada como se a tabela não tivesse o gatilho INSTEAD OF e iniciará a cadeia de operações de restrição e de execuções do gatilho 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 exemplo, se um gatilho for definido como um gatilho INSTEAD OF INSERT para uma tabela.For example, if a trigger is defined as an INSTEAD OF INSERT trigger for a table. E o gatilho executar uma instrução INSTEAD OF na mesma tabela, a instrução INSERT iniciada pelo gatilho INSTEAD OF não chamará o gatilho novamente.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. A instrução INSERT iniciada pelo gatilho inicia o processo de execução de ações de restrição e acionamento de todos os gatilhos AFTER INSERT definidos para a tabela.The INSERT launched by the trigger starts the process of running constraint actions and firing any AFTER INSERT triggers defined for the table.

Quando um gatilho INSTEAD OF definido em uma exibição executa uma instrução na exibição que em geral acionaria o gatilho INSTEAD OF novamente, ele não é chamado de forma recorrente.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. Pelo contrário, a instrução será solucionada como as modificações nas tabelas de base subjacentes à exibição.Instead, the statement is resolved as modifications against the base tables underlying the view. Nesse caso, a definição da exibição deve cumprir todas as restrições de uma exibição atualizável.In this case, the view definition must meet all the restrictions for an updatable view. Para uma definição de exibições atualizáveis, veja Modificar dados por meio de uma exibição.For a definition of updatable views, see Modify Data Through a View.

Por exemplo, se um gatilho for definido como um gatilho INSTEAD OF UPDATE para uma exibição.For example, if a trigger is defined as an INSTEAD OF UPDATE trigger for a view. E o gatilho executar uma instrução UPDATE referenciando a mesma exibição, a instrução UPDATE iniciada pelo gatilho INSTEAD OF não chamará o gatilho novamente.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. A instrução UPDATE iniciada pelo gatilho será processada na exibição como se ela não tivesse um gatilho INSTEAD OF.The UPDATE launched by the trigger is processed against the view as if the view didn't have an INSTEAD OF trigger. As colunas alteradas pela UPDATE devem ser solucionadas como uma única tabela base.The columns changed by the UPDATE must be resolved to a single base table. Toda modificação em uma tabela base subjacente inicia a cadeia de aplicações de restrição, e aciona os gatilhos AFTER INSERT definidos para a tabela.Each modification to an underlying base table starts the chain of applying constraints and firing AFTER triggers defined for the table.

Testando as ações UPDATE ou INSERT para colunas específicasTesting for UPDATE or INSERT Actions to Specific Columns

É possível criar um gatilho Transact-SQLTransact-SQL para executar determinadas ações com base em modificações UPDATE ou INSERT para colunas específicas.You can design a Transact-SQLTransact-SQL trigger to do certain actions based on UPDATE or INSERT modifications to specific columns. Use UPDATE() ou COLUMNS_UPDATED no corpo do gatilho para esse fim.Use UPDATE() or COLUMNS_UPDATED in the body of the trigger for this purpose. UPDATE() testa as tentativas UPDATE ou INSERT em uma coluna.UPDATE() tests for UPDATE or INSERT attempts on one column. COLUMNS_UPDATED testa para UPDATE ou INSERT as ações executadas em colunas várias.COLUMNS_UPDATED tests for UPDATE or INSERT actions that run on multiple columns. Essa função retorna um padrão de bits que indica quais colunas foram inseridas ou atualizadas.This function returns a bit pattern that indicates which columns were inserted or updated.

Limitações de gatilhosTrigger Limitations

CREATE TRIGGER deve ser a primeira instrução no lote e pode ser aplicada apenas a uma tabela.CREATE TRIGGER must be the first statement in the batch and can apply to only one table.

Um gatilho é criado apenas no banco de dados atual; entretanto, ele pode referenciar objetos fora do banco de dados atual.A trigger is created only in the current database; however, a trigger can reference objects outside the current database.

Se o nome de esquema do gatilho for especificado para qualificá-lo, qualifique o nome de tabela da mesma maneira.If the trigger schema name is specified to qualify the trigger, qualify the table name in the same way.

A mesma ação de gatilho pode ser definida para mais de uma ação de usuário (por exemplo, INSERT e UPDATE) na mesma instrução 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.

Os gatilhos INSTEAD OF DELETE/UPDATE não podem ser definidos em uma tabela que tenha uma chave estrangeira com uma cascata na ação DELETE/UPDATE definida.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.

Qualquer instrução SET pode ser especificada em um gatilho.Any SET statement can be specified inside a trigger. A opção SET selecionada permanece em vigor durante a execução do gatilho e depois é revertida para sua configuração anterior.The SET option selected remains in effect during the execution of the trigger and then reverts to its former setting.

Quando um gatilho é disparado, os resultados são retornados ao aplicativo de chamada, da mesma forma que com procedimentos armazenados.When a trigger fires, results are returned to the calling application, just like with stored procedures. Para evitar que os resultados sejam retornados ao aplicativo devido a um gatilho disparado, não inclua instruções SELECT que retornem resultados ou instruções que executem atribuição de variável em um gatilho.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. Um gatilho que inclua instruções SELECT que retornem resultados ao usuário ou instruções que realizem atribuição de variável requer um tratamento especial.A trigger that includes either SELECT statements that return results to the user or statements that do variable assignment, requires special handling. Você teria que gravar os resultados retornados em cada aplicativo, para os quais são permitidas modificações na tabela do gatilho.You'd have to write the returned results into every application in which modifications to the trigger table are allowed. Se uma atribuição de variável tiver de ocorrer em um gatilho, use a instrução SET NOCOUNT no início do gatilho para evitar o retorno de algum 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.

Embora a instrução TRUNCATE TABLE seja de fato uma instrução DELETE, ela não ativa um gatilho porque a operação não registra exclusões de linha individuais.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. Entretanto, somente usuários com permissões para executar uma instrução TRUNCATE TABLE precisam se preocupar em evitar inadvertidamente um gatilho DELETE dessa maneira.However, only those users with permissions to run a TRUNCATE TABLE statement need be concerned about inadvertently circumventing a DELETE trigger this way.

A instrução WRITETEXT, se registrada ou não registrada, não ativa um gatilho.The WRITETEXT statement, whether logged or unlogged, doesn't activate a trigger.

As seguintes instruções Transact-SQLTransact-SQL não são permitidas em um gatilho 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

Além disso, as instruções Transact-SQLTransact-SQL a seguir não são permitidas em um gatilho DML usado em uma tabela ou exibição que seja alvo da ação de gatilho.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 (incluindo CREATE SPATIAL INDEX e 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 quando usado faz o seguinte:ALTER TABLE when used to do the following:

Adiciona, modifica ou descarta colunas.Add, modify, or drop columns.

Alterna partições.Switch partitions.

Adiciona ou descarta restrições PRIMARY KEY ou UNIQUE.Add or drop PRIMARY KEY or UNIQUE constraints.

Observação

Como o SQL ServerSQL Server não oferece suporte a gatilhos definidos pelo usuário em tabelas do sistema, não é recomendável criá-los.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.

Otimizando gatilhos DMLOptimizing DML Triggers

Os gatilhos funcionam em transações (implícitas ou não) e, enquanto estiverem abertos, bloquearão recursos.Triggers work in transactions (implied or otherwise) and while they're open, they lock resources. O bloqueio permanecerá em vigor até que a transação seja confirmada (com COMMIT) ou rejeitada (com um ROLLBACK).The lock remains in place until the transaction is confirmed (with COMMIT) or rejected (with a ROLLBACK). Quanto mais um gatilho é executado, maior a probabilidade de outro processo ser bloqueado.The longer a trigger runs, the higher the probability that another process is then blocked. Portanto, escreva gatilhos para diminuir a duração deles sempre que possível.So, write triggers to lessen their duration whenever possible. Uma maneira de alcançar uma duração mais curta é liberar um gatilho quando uma instrução DML altera zero linha.One way to achieve shorter duration is to release a trigger when a DML statement changes zero rows.

Para liberar o gatilho para um comando que não altera nenhuma linha, empregue a variável de sistema ROWCOUNT_BIG.To release the trigger for a command that doesn't change any rows, employ the system variable ROWCOUNT_BIG.

O seguinte snippet de código T-SQL mostra como liberar o gatilho para um comando que não altera nenhuma linha.The following T-SQL code snippet shows how to release the trigger for a command that doesn't change any rows. Esse código deverá estar presente no início de cada gatilho DML:This code should be present at the beginning of each DML trigger:

IF (ROWCOUNT_BIG() = 0)
RETURN;

Comentários para gatilhos DDLRemarks for DDL Triggers

Os gatilhos DDL, assim como os gatilhos padrão, iniciam procedimentos armazenados em resposta a um evento.DDL triggers, like standard triggers, launch stored procedures in response to an event. Contudo, diferentemente dos gatilhos padrão, eles não são executados em resposta a instruções UPDATE, INSERT ou DELETE em uma tabela ou exibição.But, unlike standard triggers, they don't run in response to UPDATE, INSERT, or DELETE statements on a table or view. Em vez disso, eles são executados em resposta a instruções DDL (linguagem de definição de dados).Instead, they primarily run in response to data definition language (DDL) statements. Os tipos de instrução incluem CREATE, ALTER, DROP, GRANT, DENY, REVOKE e UPDATE STATISTICS.The statement types include CREATE, ALTER, DROP, GRANT, DENY, REVOKE, and UPDATE STATISTICS. Determinados procedimentos armazenados do sistema que executam operações do tipo DDL também podem disparar gatilhos DDL.Certain system stored procedures that carry out DDL-like operations can also fire DDL triggers.

Importante

Teste os gatilhos DDL para determinar suas respostas à execução de procedimentos armazenados do sistema.Test your DDL triggers to determine their responses to system stored procedure execution. Por exemplo, a instrução CREATE TYPE e os procedimentos armazenados sp_addtype e sp_rename disparam um gatilho DDL que é criado em um 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 obter mais informações sobre gatilhos DDL, veja Gatilhos DDL.For more information about DDL triggers, see DDL Triggers.

Os gatilhos DDL não são disparados em resposta a eventos que afetem tabelas temporárias locais ou globais e procedimentos armazenados.DDL triggers don't fire in response to events that affect local or global temporary tables and stored procedures.

Diferentemente dos gatilhos DML, os gatilhos DDL não têm seu escopo definido para esquemas.Unlike DML triggers, DDL triggers aren't scoped to schemas. Portanto, não é possível usar funções como OBJECT_ID, OBJECT_NAME, OBJECTPROPERTY e OBJECTPROPERTYEX para consultar metadados sobre gatilhos DDL.So, you can't use functions such as OBJECT_ID, OBJECT_NAME, OBJECTPROPERTY, and OBJECTPROPERTYEX for 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.

Observação

Gatilhos DDL no escopo do servidor aparecem no Pesquisador de Objetos do SQL Server Management StudioSQL Server Management Studio na pasta Gatilhos.Server-scoped DDL triggers appear in the SQL Server Management StudioSQL Server Management Studio Object Explorer in the Triggers folder. Essa pasta está localizada na pasta Server Objects .This folder is located under the Server Objects folder. Gatilhos DDL no escopo do banco de dados aparecem na pasta Gatilhos de Banco de Dados.Database-scoped DDL Triggers appear in the Database Triggers folder. Essa pasta fica localizada na pasta Programmability do banco de dados correspondente.This folder is located under the Programmability folder of the corresponding database.

Gatilhos de logonLogon Triggers

Os gatilhos de logon realizam procedimentos armazenados em resposta a um evento LOGON.Logon triggers carry out stored procedures in response to a LOGON event. Esse evento ocorre quando é estabelecida uma sessão de usuário com uma instância do SQL ServerSQL Server.This event happens when a user session is established with an instance of SQL ServerSQL Server. Os gatilhos de logon são acionados após o término da fase de autenticação, mas antes da sessão de usuário ser estabelecida.Logon triggers fire after the authentication phase of logging in finishes, but before the user session is established. Portanto, todas as mensagens originadas no gatilho que chegariam, normalmente, ao usuário, como mensagens de erro e mensagens da instrução PRINT, são desviadas para o log de erros do 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 obter mais informações, veja Gatilhos de logon.For more information, see Logon Triggers.

Os gatilhos de logon não são acionados quando a autenticação falha.Logon triggers don't fire if authentication fails.

Não há suporte para transações distribuídas em um gatilho de logon.Distributed transactions aren't supported in a logon trigger. O erro 3969 é retornado quando é disparado um gatilho de logon que contém uma transação distribuída.Error 3969 returns when a logon trigger that contains a distributed transaction fire.

Desabilitando um gatilho de logonDisabling a Logon Trigger

Um gatilho de logon pode, efetivamente, impedir conexões com o Mecanismo de Banco de DadosDatabase Engine para todos os usuários, incluindo membros da função de servidor fixa sysadmin .A logon trigger can effectively prevent successful connections to the Mecanismo de Banco de DadosDatabase Engine for all users, including members of the sysadmin fixed server role. Quando um gatilho de logon está impedindo conexões, os membros da função de servidor fixa sysadmin podem se conectar usando a conexão de administrador dedicada ou iniciando o Mecanismo de Banco de DadosDatabase Engine no modo de configuração 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 Mecanismo de Banco de DadosDatabase Engine in minimal configuration mode (-f). Para obter mais informações, consulte Opções de inicialização do serviço Mecanismo de Banco de Dados.For more information, see Database Engine Service Startup Options.

Considerações gerais sobre gatilhosGeneral Trigger Considerations

Retornando resultadosReturning Results

A habilidade de retornar resultados de gatilhos será removida na próxima versão do SQL Server.The ability to return results from triggers will be removed in a future version of SQL Server. Os gatilhos que retornam conjuntos de resultados podem causar um comportamento inesperado em aplicativos que não são projetados para trabalhar com eles.Triggers that return result sets may cause unexpected behavior in applications that aren't designed to work with them. Evite retornar conjuntos de resultados de gatilhos em novos trabalhos de desenvolvimento e planeje a modificação de aplicativos que atualmente fazem.Avoid returning result sets from triggers in new development work, and plan to modify applications that currently do. Para evitar que os gatilhos retornem conjuntos de resultados, defina a opção proibir resultados de gatilhos como 1.To prevent triggers from returning result sets, set the disallow results from triggers option to 1.

Os gatilhos de logon sempre impedem o retorno de conjuntos de resultados, e esse comportamento não é configurável.Logon triggers always disallow the return of results sets and this behavior isn't configurable. Se um gatilho de logon gerar um conjunto de resultados, o gatilho falhará ao ser iniciado e a tentativa de logon que o disparou será negada.If a logon trigger generates a result set, the trigger fails to launch and the login attempt that fired the trigger is denied.

Vários gatilhosMultiple Triggers

O SQL ServerSQL Server permite a criação de vários gatilhos para cada evento DML, DDL ou LOGON.SQL ServerSQL Server lets you create multiple triggers for each DML, DDL, or LOGON event. Por exemplo, se CREATE TRIGGER FOR UPDATE for executado para uma tabela que já tenha um gatilho UPDATE, um gatilho update adicional será criado.For example, if CREATE TRIGGER FOR UPDATE is run for a table that already has an UPDATE trigger, an additional update trigger is created. Nas versões anteriores do SQL ServerSQL Server, somente um gatilho para cada evento de modificação de dados UPDATE, DELETE ou INSERT é permitido para cada tabela.In earlier versions of SQL ServerSQL Server, only one trigger for each INSERT, UPDATE, or DELETE data modification event is allowed for each table.

Gatilhos recursivosRecursive Triggers

O SQL ServerSQL Server também oferece suporte à invocação recursiva de gatilhos quando a configuração RECURSIVE_TRIGGERS é habilitada por meio do uso de ALTER DATABASE.SQL ServerSQL Server also supports recursive invocation of triggers when the RECURSIVE_TRIGGERS setting is enabled using ALTER DATABASE.

Os gatilhos recursivos permitem que os seguintes tipos de recursão ocorram:Recursive triggers enable the following types of recursion to occur:

  • Recursão indiretaIndirect recursion

    Com a recursão indireta, um aplicativo atualiza a tabela T1.With indirect recursion, an application updates table T1. Isso dispara o gatilho TR1, atualizando a tabela T2.This fires trigger TR1, updating table T2. O gatilho T2 é disparado e atualiza a tabela T1.Trigger T2 then fires and updates table T1.

  • Recursão diretaDirect recursion

    Na recursão direta, o aplicativo atualiza a tabela T1.In direct recursion, the application updates table T1. Isso dispara o gatilho TR1, atualizando a tabela T1.This fires trigger TR1, updating table T1. Uma vez que a tabela T1 foi atualizada, o gatilho TR1 é disparado novamente e assim por diante.Because table T1 was updated, trigger TR1 fires again, and so on.

O exemplo a seguir usa as duas recursões de gatilho, direta e indireta. Suponha que dois gatilhos de atualização, TR1 e TR2, sejam definidos na tabela T1.The following example uses both indirect and direct trigger recursion Assume that two update triggers, TR1 and TR2, are defined on table T1. O gatilho TR1 atualiza a tabela T1 recursivamente.Trigger TR1 updates table T1 recursively. Uma instrução UPDATE executa TR1 e TR2 uma vez.An UPDATE statement runs each TR1 and TR2 one time. Além disso, a execução de TR1 inicia a execução de TR1 (recursivamente) e de TR2.Additionally, the launch of TR1 triggers the execution of TR1 (recursively) and TR2. As tabelas inseridas e excluídas para um gatilho específico contêm linhas que correspondem somente à instrução UPDATE que invocou o gatilho.The inserted and deleted tables for a specific trigger contain rows that correspond only to the UPDATE statement that invoked the trigger.

Observação

O comportamento anterior só ocorrerá se a configuração RECURSIVE_TRIGGERS for habilitada através do uso de ALTER DATABASE.The previous behavior occurs only if the RECURSIVE_TRIGGERS setting is enabled by using ALTER DATABASE. Não há nenhuma ordem definida na qual vários gatilhos definidos para um evento específico sejam executados.There's no defined order in which multiple triggers defined for a specific event are run. Cada gatilho deve ser autossuficiente.Each trigger should be self-contained.

Desabilitar a configuração RECURSIVE_TRIGGERS evita apenas recursões diretas.Disabling the RECURSIVE_TRIGGERS setting only prevents direct recursions. Para desabilitar a recursão indireta também, defina a opção de servidor de gatilhos aninhados como 0 usando sp_configure.To disable indirect recursion also, set the nested triggers server option to 0 by using sp_configure.

Se qualquer um dos gatilhos executar uma ROLLBACK TRANSACTION, independentemente do nível de aninhamento, nenhum outro gatilho será executado.If any one of the triggers carries out a ROLLBACK TRANSACTION, regardless of the nesting level, no more triggers are run.

Gatilhos aninhadosNested Triggers

É possível aninhar até no máximo 32 níveis.You can nest triggers to a maximum of 32 levels. Se um gatilho alterar uma tabela em que haja outro gatilho, o segundo gatilho será ativado e poderá chamar um terceiro gatilho e assim por diante.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. Se qualquer gatilho na cadeia iniciar um loop infinito, o nível de aninhamento será excedido e o gatilho será cancelado.If any trigger in the chain sets off an infinite loop, the nesting level is exceeded and the trigger is canceled. Quando um gatilho Transact-SQLTransact-SQL inicia um código gerenciado fazendo referência a uma rotina, tipo ou agregação CLR, essa referência também conta como um nível no limite de aninhamento de nível 32.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. Os métodos invocados a partir do código gerenciado não são contados em relação a esse limite.Methods invoked from within managed code don't count against this limit.

Para desabilitar gatilhos aninhados, defina a opção de gatilhos aninhados de sp_configure como 0 (desativada).To disable nested triggers, set the nested triggers option of sp_configure to 0 (off). A configuração padrão oferece suporte a gatilhos aninhados.The default configuration supports nested triggers. Se os gatilhos aninhados estiverem desativados, os gatilhos recursivos também serão desabilitados, apesar da configuração RECURSIVE_TRIGGERS definida por meio do uso de ALTER DATABASE.If nested triggers are off, recursive triggers are also disabled, despite the RECURSIVE_TRIGGERS setting that's set by using ALTER DATABASE.

O primeiro gatilho AFTER aninhado dentro de um gatilho INSTEAD OF será disparado mesmo se a opção de configuração do servidor de gatilhos aninhados for 0.The first AFTER trigger nested inside an INSTEAD OF trigger fires even if the nested triggers server configuration option is 0. Porém, nessa configuração, os gatilhos AFTER posteriores não são disparados.But, under this setting, the later AFTER triggers don't fire. Verifique se há gatilhos aninhados nos seus aplicativos a fim de determinar se os aplicativos seguem as regras de negócio quando a opção de configuração do servidor de gatilhos aninhados está definida como 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. Caso contrário, faça as modificações apropriadas.If not, make the appropriate modifications.

Resolução de nome adiadaDeferred Name Resolution

O SQL ServerSQL Server permite que procedimentos armazenados, gatilhos e lotes Transact-SQLTransact-SQL referenciem tabelas que não existem em tempo de compilação.SQL ServerSQL Server allows for Transact-SQLTransact-SQL stored procedures, triggers, and batches to refer to tables that don't exist at compile time. Essa capacidade é chamada de resolução de nome adiada.This ability is called deferred name resolution.

PermissõesPermissions

A criação de um gatilho DML requer a permissão ALTER na tabela ou exibição na qual o gatilho é criado.To create a DML trigger, it requires ALTER permission on the table or view on which the trigger is being created.

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

ExemplosExamples

A.A. Usando um gatilho DML com uma mensagem de lembreteUsing a DML trigger with a reminder message

O gatilho DML a seguir imprime uma mensagem para o cliente quando alguém tenta adicionar ou alterar dados na tabela Customer no banco de dados 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. Usando um gatilho DML com uma mensagem de email de lembreteUsing a DML trigger with a reminder e-mail message

O exemplo a seguir envia uma mensagem de email a uma pessoa especificada (MaryM) quando a tabela Customer é alterada.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. Usando um gatilho DML AFTER para impor uma regra de negócio entre as tabelas PurchaseOrderHeader e VendorUsing a DML AFTER trigger to enforce a business rule between the PurchaseOrderHeader and Vendor tables

Como as restrições CHECK só referenciam as colunas nas quais a restrição de nível de coluna ou de nível de tabela é definida, é preciso definir qualquer restrição de tabela cruzada (nesse caso, as regras de negócio) como gatilho.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.

O exemplo a seguir cria um gatilho DML no banco de dados AdventureWorks2012.The following example creates a DML trigger in the AdventureWorks2012 database. Esse gatilho realiza uma verificação para ter certeza de que a avaliação de crédito do fornecedor é satisfatória (não 5) quando há uma tentativa de inserir uma nova ordem de compra na tabela 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 obter a classificação de crédito do fornecedor, a tabela Vendor deve ser referenciada.To get the credit rating of the vendor, the Vendor table must be referenced. Se a classificação de crédito for muito baixa, uma mensagem será exibida e a inserção não será executada.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. Usando um gatilho DDL no escopo do banco de dadosUsing a database-scoped DDL trigger

O exemplo a seguir usa um gatilho DDL para evitar que qualquer sinônimo em um banco de dados seja descartado.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. Usando um gatilho DDL no escopo do servidorUsing a server-scoped DDL trigger

O exemplo a seguir usa um gatilho DDL para imprimir uma mensagem se qualquer evento CREATE DATABASE ocorrer na instância do servidor atual e usa a função EVENTDATA para recuperar o texto da instrução Transact-SQLTransact-SQL correspondente.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 obter mais exemplos que usam EVENTDATA em gatilhos DDL, veja Usar a função EVENTDATA.For more examples that use EVENTDATA in DDL triggers, see Use the EVENTDATA Function.

Aplica-se a: do SQL Server 2008SQL Server 2008 ao 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. Usando um gatilho de logonUsing a logon trigger

O exemplo de gatilho de logon a seguir nega uma tentativa de logon no SQL ServerSQL Server como um membro do logon login_test se já houver três sessões de usuário executadas com esse logon.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.

Aplica-se a: do SQL Server 2008SQL Server 2008 ao 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. Exibindo os eventos que fazem um gatilho ser acionadoViewing the events that cause a trigger to fire

O exemplo a seguir consulta as exibições do catálogo sys.triggers e sys.trigger_events para determinar quais eventos de linguagem Transact-SQLTransact-SQL fazem o gatilho safety ser acionado.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. O gatilho, safety, é criado no exemplo 'D', localizado acima.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 TambémSee 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)
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)