sp_settriggerorder (Transact-SQL)

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada de SQL do Azure

Especifica os gatilhos AFTER que são acionados primeiro ou por último. Os AFTER gatilhos que são disparados entre o primeiro e o último gatilhos 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 disparador. @stmttype é varchar(50) e pode ser INSERT, UPDATE, , LOGONDELETE, 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 ou Last gatilho para um tipo de instrução somente depois que esse gatilho foi definido como um gatilho First para esse tipo de instrução. Por exemplo, o gatilho TR1 pode ser designado First para INSERT na tabela 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 disparador, estiver definido como um First disparador ou Last para uma UPDATE instrução. Para obter mais informações, consulte a seção Comentários.

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

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 de 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 First para 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 retornará um erro. Se você usar ALTER TRIGGER no gatilho de replicação ou usar sp_settriggerorder para alterar o gatilho de replicação para um Last ou None disparador, 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 disparador. 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 First
  2. Outros gatilhos no nível do servidor
  3. O gatilho no nível do servidor marcado Last
  4. O gatilho no nível do banco de dados marcado First
  5. Outros gatilhos no nível do banco de dados
  6. O gatilho no nível do banco de dados marcado Last

Considerações gerais sobre gatilhos

Se uma ALTER TRIGGER instrução alterar um primeiro ou último disparador, 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 deve ser designado como a primeira ou a última ordem para mais de um tipo de instrução, sp_settriggerorder deve ser executado para cada tipo de instrução. Além disso, o gatilho deve ser definido primeiro para um tipo de instrução antes que ele possa ser designado como o ou Last gatilho para disparar 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.

A definição da 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 para 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 disparo para um gatilho DDL

O exemplo a seguir especifica que o gatilho ddlDatabaseTriggerLog é o primeiro gatilho a ser acionado após a AdventureWorks2022 ocorrência de um ALTER_TABLE evento no banco de dados.

USE AdventureWorks2022;
GO

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