Compartilhar via


sp_settriggerorder (Transact-SQL)

Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure

Especifica os AFTER gatilhos que são disparados primeiro ou por último. Os AFTER gatilhos disparados entre o primeiro e o último disparadores são executados em ordem indefinida.

Convenções de sintaxe de Transact-SQL

Sintaxe

sp_settriggerorder
    [ @triggername = ] N'triggername'
    , [ @order = ] 'order'
    , [ @stmttype = ] 'stmttype'
    [ , [ @namespace = ] 'DATABASE' | 'SERVER' | NULL ]
[ ; ]

Argumentos

@triggername [ = ] N'nome do gatilho'

O nome do gatilho e o esquema ao qual ele pertence, se aplicável, cuja ordem deve ser definida ou alterada. @triggername é nvarchar(517), sem padrão, e está no formato [ trigger_schema . ] trigger_name. Se o nome não corresponder a um gatilho ou se o nome corresponder a um INSTEAD OF gatilho, o procedimento retornará um erro. Um esquema não pode ser especificado para gatilhos DDL ou de logon.

@order [ = ] 'ordem'

A configuração para a nova ordem do gatilho. @order é varchar(10) e pode ser qualquer um dos seguintes valores.

Valor Descrição
First O disparador é acionado em primeiro lugar.
Last O disparador é acionado em último lugar.
None O disparador é acionado em ordem indefinida.

Importante

Os First gatilhos e Last devem ser dois gatilhos diferentes.

@stmttype [ = ] 'stmttype'

Especifica a instrução Transact-SQL que aciona o gatilho. @stmttype é varchar(50) e pode ser INSERT, UPDATE, DELETE, LOGON, ou qualquer evento de instrução T-SQL listado em Eventos DDL. Os grupos de eventos não podem ser especificados.

Um gatilho pode ser designado como o First gatilho or Last para um tipo de instrução somente depois que esse gatilho foi definido como um gatilho para esse tipo de instrução. Por exemplo, o gatilho TR1 pode ser designado First para INSERT na mesa T1 se TR1 for definido como um INSERT gatilho. O Mecanismo de Banco de Dados retornará um erro se TR1, que foi definido apenas como um INSERT gatilho, for definido como um First gatilho ou Last para uma UPDATE instrução. Para obter mais informações, consulte a seção Comentários.

@namespace = { 'BANCO DE DADOS' | 'SERVIDOR' | NULO }

Quando @triggername é um gatilho DDL, @namespace especifica se @triggername foi criado com escopo de banco de dados ou escopo de servidor. Se @triggername for um gatilho de logon, SERVER deverá ser especificado. Para obter mais informações sobre o escopo do gatilho DDL, consulte Gatilhos DDL. Se não for especificado ou se NULL for especificado, @triggername é um gatilho DML.

Valores do código de retorno

0 (sucesso) e 1 (fracasso).

Comentários

Esta seção discute considerações para gatilhos de linguagem de manipulação de dados (DML) e linguagem de definição de dados (DDL).

Gatilhos DML

Pode haver apenas um First e um Last gatilho para cada instrução em uma única tabela.

Se um First gatilho já estiver definido na tabela, banco de dados ou servidor, você não poderá designar um novo gatilho para First a mesma tabela, banco de dados ou servidor para o mesmo @stmttype. Essa restrição também se aplica Last a gatilhos.

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. A replicação requer que seu gatilho seja o primeiro gatilho. 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. Se você tentar tornar um gatilho um primeiro gatilho depois que uma tabela for incluída em uma assinatura, sp_settriggerorder o retornará um erro. Se você usar ALTER TRIGGER o gatilho de replicação ou alterar sp_settriggerorder o gatilho de replicação para um Last gatilho ou None , a assinatura não funcionará corretamente.

Gatilhos DDL

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 First gatilho ou um Last gatilho. Entretanto, disparadores com escopo no servidor sempre são acionados em primeiro lugar. Em geral, a ordem de execução de disparadores DDL que existem no mesmo evento é a seguinte:

  1. O gatilho no nível do servidor marcado como First
  2. Outros gatilhos no nível do servidor
  3. O gatilho no nível do servidor marcado como Last
  4. O gatilho no nível do banco de dados marcado como First
  5. Outros gatilhos no nível do banco de dados
  6. O gatilho no nível do banco de dados marcado como Last

Considerações gerais sobre o gatilho

Se uma ALTER TRIGGER instrução alterar um primeiro ou último gatilho, o First atributo ou Last originalmente definido no gatilho será descartado e o valor será substituído por None. O valor do pedido deve ser redefinido usando sp_settriggerorder.

Se o mesmo gatilho precisar ser designado como a primeira ou a última ordem para mais de um tipo de instrução, sp_settriggerorder deverá ser executado para cada tipo de instrução. Além disso, o gatilho deve ser definido primeiro para um tipo de instrução antes de poder ser designado como o gatilho or Last a ser disparado First para esse tipo de instrução.

Permissões

Definir a ordem de um gatilho DDL com escopo de servidor (criado ON ALL SERVER) ou um gatilho de logon requer CONTROL SERVER permissão.

Definir a ordem de um gatilho DDL com escopo de banco de dados (criado ON DATABASE) requer ALTER ANY DATABASE DDL TRIGGER permissão.

Definir a ordem de um gatilho DML requer ALTER permissão na tabela ou exibição na qual o gatilho está definido.

Exemplos

R. Definir a ordem de disparo de um gatilho DML

O exemplo a seguir especifica que o gatilho uSalesOrderHeader é o primeiro gatilho a ser acionado depois que uma UPDATE operação ocorre na Sales.SalesOrderHeader tabela.

USE AdventureWorks2022;
GO

EXEC sp_settriggerorder @triggername = 'Sales.uSalesOrderHeader',
    @order = 'First',
    @stmttype = 'UPDATE';

B. Definir a ordem de acionamento de um gatilho DDL

O exemplo a seguir especifica que o gatilho ddlDatabaseTriggerLog é o primeiro gatilho a ser acionado depois que um ALTER_TABLE evento ocorre no AdventureWorks2022 banco de dados.

USE AdventureWorks2022;
GO

EXEC sp_settriggerorder @triggername = 'ddlDatabaseTriggerLog',
    @order = 'First',
    @stmttype = 'ALTER_TABLE',
    @namespace = 'DATABASE';