sp_settriggerorder (Transact-SQL)sp_settriggerorder (Transact-SQL)

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

Especifica os disparadores AFTER que são acionados em primeiro ou último lugar.Specifies the AFTER triggers that are fired first or last. Os disparadores AFTER que são acionados entre o primeiro e o último disparador são executados em ordem indefinida.The AFTER triggers that are fired between the first and last triggers are executed in undefined order.

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

SintaxeSyntax

  
sp_settriggerorder [ @triggername = ] '[ triggerschema. ] triggername'   
    , [ @order = ] 'value'   
    , [ @stmttype = ] 'statement_type'   
    [ , [ @namespace = ] { 'DATABASE' | 'SERVER' | NULL } ]  

ArgumentosArguments

[ @triggername = ] '[ _triggerschema.] _triggername' é o nome do gatilho e o esquema ao qual ele pertence, se aplicável, cuja ordem deve ser definida ou alterada.[ @triggername = ] '[ _triggerschema.] _triggername' Is the name of the trigger and the schema to which it belongs, if applicable, whose order is to be set or changed. [triggerschema . ] triggername é sysname.[triggerschema.]triggername is sysname. Se o nome não corresponder a um disparador ou se o nome corresponder a um disparador INSTEAD OF, o procedimento retornará um erro.If the name does not correspond to a trigger or if the name corresponds to an INSTEAD OF trigger, the procedure returns an error. triggerschema não pode ser especificado para gatilhos DDL ou de logon.triggerschema cannot be specified for DDL or logon triggers.

[ @order = ] 'value' é a configuração para a nova ordem do gatilho.[ @order = ] 'value' Is the setting for the new order of the trigger. o valor é varchar (10) e pode ser qualquer um dos valores a seguir.value is varchar(10) and it can be any one of the following values.

Importante

O primeiro e o último gatilho devem ser dois gatilhos diferentes.The First and Last triggers must be two different triggers.

ValorValue DescriçãoDescription
PrimeiroFirst O disparador é acionado em primeiro lugar.Trigger is fired first.
LastLast O disparador é acionado em último lugar.Trigger is fired last.
Nenhum.None O disparador é acionado em ordem indefinida.Trigger is fired in undefined order.

[ @stmttype = ] 'statement_type' especifica a instrução SQL que dispara o gatilho.[ @stmttype = ] 'statement_type' Specifies the SQL statement that fires the trigger. statement_type é varchar (50) e pode ser de inserção, atualização, exclusão, logon ou qualquer evento de instrução Transact-SQLTransact-SQL listado em eventos DDL.statement_type is varchar(50) and can be INSERT, UPDATE, DELETE, LOGON, or any Transact-SQLTransact-SQL statement event listed in DDL Events. Os grupos de eventos não podem ser especificados.Event groups cannot be specified.

Um gatilho pode ser designado como o primeiro ou último gatilho para um tipo de instrução somente depois que esse gatilho tiver sido definido como um gatilho para esse tipo de instrução.A trigger can be designated as the First or Last trigger for a statement type only after that trigger has been defined as a trigger for that statement type. Por exemplo, o disparador de TR1 pode ser designado primeiro para INSERT na tabela T1 se o TR1 for definido como um gatilho de inserção.For example, trigger TR1 can be designated First for INSERT on table T1 if TR1 is defined as an INSERT trigger. O Mecanismo de Banco de DadosDatabase Engine retornará um erro se o TR1, que foi definido somente como um gatilho de inserção, estiver definido como um gatilho Firstou Last, para uma instrução UPDATE.The Mecanismo de Banco de DadosDatabase Engine returns an error if TR1, which has been defined only as an INSERT trigger, is set as a First, or Last, trigger for an UPDATE statement. Para obter mais informações, consulte a seção Comentários.For more information, see the Remarks section.

@namespace = { ' database ' | ' Server ' | NULO@namespace= { 'DATABASE' | 'SERVER' | NULL }
Quando triggername é um gatilho DDL, @namespace especifica se triggername foi criado com escopo de banco de dados ou escopo de servidor.When triggername is a DDL trigger, @namespace specifies whether triggername was created with database scope or server scope. Se triggername for um gatilho de logon, o servidor deverá ser especificado.If triggername is a logon trigger, SERVER must be specified. Para obter mais informações sobre o escopo do gatilho DDL, consulte gatilhos DDL.For more information about DDL trigger scope, see DDL Triggers. Se não for especificado, ou se NULL for especificado, triggername será um gatilho DML.If not specified, or if NULL is specified, triggername is a DML trigger.

O servidor aplica-se a: SQL Server 2008SQL Server 2008 e posterior.SERVER applies to: SQL Server 2008SQL Server 2008 and later.

Valores do código de retornoReturn Code Values

0 (êxito) e 1 (falha)0 (success) and 1 (failure)

RemarksRemarks

Gatilhos DMLDML Triggers

Pode haver apenas um primeiro e um último gatilho para cada instrução em uma única tabela.There can be only one First and one Last trigger for each statement on a single table.

Se um primeiro gatilho já estiver definido na tabela, no banco de dados ou no servidor, você não poderá designar um novo gatilho como primeiro para a mesma tabela, banco de dados ou servidor para o mesmo statement_type.If a First trigger is already defined on the table, database, or server, you cannot designate a new trigger as First for the same table, database, or server for the same statement_type. Essa restrição também aplica os últimos gatilhos.This restriction also applies Last triggers.

A replicação gera automaticamente um primeiro disparador para qualquer tabela que esteja incluída em uma atualização imediata ou uma assinatura de atualização em fila.Replication automatically generates a first trigger for any table that is included in an immediate updating or queued updating subscription. A replicação requer que seu disparador seja o primeiro disparador.Replication requires that its trigger be the first trigger. A replicação gerará um erro se você tentar incluir uma tabela com um primeiro disparador em uma atualização imediata ou uma assinatura de atualização em fila.Replication raises an error when you try to include a table with a first trigger in an immediate updating or queued updating subscription. Se você tentar fazer com que um gatilho seja o primeiro depois que uma tabela for incluída em uma assinatura, sp_settriggerorder retornará um erro.If you try to make a trigger a first trigger after a table has been included in a subscription, sp_settriggerorder returns an error. Se você usar ALTER TRIGGER no gatilho de replicação ou usar sp_settriggerorder para alterar o gatilho de replicação para um gatilho Last ou None , a assinatura não funcionará corretamente.If you use ALTER TRIGGER on the replication trigger, or use sp_settriggerorder to change the replication trigger to a Last or None trigger, the subscription does not function correctly.

Gatilhos DDLDDL Triggers

Se um gatilho DDL com escopo de banco de dados e um gatilho DDL com escopo de servidor existirem no mesmo evento, você poderá especificar que ambos os gatilhos sejam um primeiro gatilho ou um último gatilho.If a DDL trigger with database scope and a DDL trigger with server scope exist on the same event, you can specify that both triggers be a First trigger or a Last trigger. Entretanto, disparadores com escopo no servidor sempre são acionados em primeiro lugar.However, server-scoped triggers always fire first. Em geral, a ordem de execução de disparadores DDL que existem no mesmo evento é a seguinte:In general, the order of execution of DDL triggers that exist on the same event is as follows:

  1. O gatilho de nível de servidor marcado primeiro.The server-level trigger marked First.

  2. Outros disparadores do nível do servidor.Other server-level triggers.

  3. O gatilho de nível de servidor marcado como último.The server-level trigger marked Last.

  4. O gatilho de nível de banco de dados marcado primeiro.The database-level trigger marked First.

  5. Outros disparadores do nível do banco de dados.Other database-level triggers.

  6. O gatilho de nível de banco de dados marcado como último.The database-level trigger marked Last.

Considerações gerais sobre gatilhosGeneral Trigger Considerations

Se uma instrução ALTER TRIGGER alterar um primeiro ou último gatilho, o primeiro ou último atributo originalmente definido no gatilho será descartado e o valor será substituído por None.If an ALTER TRIGGER statement changes a first or last trigger, the First or Last attribute originally set on the trigger is dropped, and the value is replaced by None. O valor do pedido deve ser redefinido usando sp_settriggerorder.The order value must be reset by using sp_settriggerorder.

Se o mesmo gatilho deve ser designado como a primeira ou última ordem para mais de um tipo de instrução, sp_settriggerorder deve ser executado para cada tipo de instrução.If the same trigger must be designated as the first or last order for more than one statement type, sp_settriggerorder must be executed for each statement type. Além disso, o gatilho deve ser definido primeiro para um tipo de instrução antes que possa ser designado como o primeiro ou último gatilho a ser acionado para esse tipo de instrução.Also, the trigger must be first defined for a statement type before it can be designated as the First or Last trigger to fire for that statement type.

PermissõesPermissions

A definição da ordem de um disparador DDL com escopo no servidor (criado ON ALL SERVER) ou um disparador de logon requer permissão CONTROL SERVER.To set the order of a DDL trigger with server scope (created ON ALL SERVER) or a logon trigger requires CONTROL SERVER permission.

A definição da ordem de um disparador DDL com escopo no banco de dados (criado ON DATABASE) requer permissão ALTER ANY DATABASE DDL TRIGGER.To set the order of a DDL trigger with database scope (created ON DATABASE) requires ALTER ANY DATABASE DDL TRIGGER permission.

A definição da ordem de um disparador DML requer permissão ALTER na tabela ou exibição na qual o disparador está definido.To set the order of a DML trigger requires ALTER permission on the table or view on which the trigger is defined.

ExemplosExamples

A.A. Definindo a ordem de acionamento para um disparador DMLSetting the firing order for a DML trigger

O exemplo a seguir especifica que o disparador uSalesOrderHeader será o primeiro disparador a ser acionado depois que uma operação UPDATE ocorrer na tabela Sales.SalesOrderHeader.The following example specifies that trigger uSalesOrderHeader be the first trigger to fire after an UPDATE operation occurs on the Sales.SalesOrderHeader table.

USE AdventureWorks2012;  
GO  
sp_settriggerorder @triggername= 'Sales.uSalesOrderHeader', @order='First', @stmttype = 'UPDATE';  

b.B. Definindo a ordem de acionamento para um disparador DDLSetting the firing order for a DDL trigger

O exemplo a seguir especifica que o disparador ddlDatabaseTriggerLog será o primeiro disparador a ser acionado depois que um evento ALTER_TABLE ocorrer no banco de dados AdventureWorks2012AdventureWorks2012.The following example specifies that trigger ddlDatabaseTriggerLog be the first trigger to fire after an ALTER_TABLE event occurs in the AdventureWorks2012AdventureWorks2012 database.

USE AdventureWorks2012;  
GO  
sp_settriggerorder @triggername= 'ddlDatabaseTriggerLog', @order='First', @stmttype = 'ALTER_TABLE', @namespace = 'DATABASE';  

Consulte tambémSee Also

Procedimentos armazenados do sistema (Transact-SQL) System Stored Procedures (Transact-SQL)
Mecanismo de banco de dados procedimentos (armazenados Transact-) SQLDatabase Engine Stored Procedures (Transact-SQL)
ALTER TRIGGER (Transact-SQL)ALTER TRIGGER (Transact-SQL)