Partilhar via


sp_settriggerorder (Transact-SQL)

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

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

Transact-SQL convenções de sintaxe

Sintaxe

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

Arguments

[ @triggername = ] N'triggername'

O nome do gatilho e o esquema a que 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 trigger ou se o nome corresponder a um INSTEAD OF trigger, o procedimento devolve um erro. Um esquema não pode ser especificado para triggers DDL ou logon.

[ @order = ] 'ordem'

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

Valor Description
First O gatilho é disparado primeiro.
Last O gatilho é disparado por último.
None O gatilho é acionado numa ordem indefinida.

Importante

Os First gatilhos e Last devem ser dois gatilhos diferentes.

[ @stmttype = ] 'stmttype'

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

Um trigger só pode ser designado como First trigger ou Last para um tipo de instrução depois de esse trigger ter sido definido como trigger para esse tipo de instrução. Por exemplo, trigger TR1 pode ser designado First para INSERT na tabela T1 se TR1 for definido como trigger INSERT . O Motor de Base de Dados devolve um erro se TR1, que foi definido apenas como um INSERT trigger, estiver definido como trigger ou FirstLast para uma UPDATE instrução. Para obter mais informações, consulte a seção Observações .

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

Quando @triggername é um gatilho DDL, @namespace especifica se @triggername foi criado com o âmbito da base de dados ou do servidor. Se @triggername for um gatilho de logon, SERVER deve ser especificado. Para 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 de código de retorno

0 (sucesso) e 1 (fracasso).

Observações

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

Gatilhos DML

Só pode haver um First e um Last gatilho para cada instrução numa única tabela.

Se um First trigger já estiver definido na tabela, base de dados ou servidor, não pode designar um novo trigger para First a mesma tabela, base de dados ou servidor para o mesmo @stmttype. Esta restrição também se aplica Last a gatilhos.

A replicação gera automaticamente um primeiro gatilho para qualquer tabela incluída numa subscrição de atualização imediata ou em fila. A replicação exige que o seu gatilho seja o primeiro disparador. A replicação gera um erro quando tenta incluir uma tabela com o primeiro gatilho numa subscrição de atualização imediata ou em fila. Se tentar fazer de um gatilho o primeiro disparador depois de uma tabela ser incluída numa subscrição, sp_settriggerorder devolve um erro. Se usares ALTER TRIGGER no gatilho de replicação, ou sp_settriggerorder usares para mudar o gatilho de replicação para um Last ou None trigger, a subscrição não funciona corretamente.

Gatilhos DDL

Se existirem um gatilho DDL com âmbito de base de dados e um disparador DDL com âmbito de servidor no mesmo evento, pode especificar que ambos os gatilhos sejam um First gatilho ou um Last gatilho. No entanto, os gatilhos com alcance servidor disparam sempre primeiro. Em geral, a ordem de execução dos disparadores DDL que existem no mesmo evento é a seguinte:

  1. O gatilho ao nível do servidor marcado First
  2. Outros gatilhos ao nível do servidor
  3. O gatilho ao nível do servidor marcado Last
  4. O gatilho ao nível da base de dados marcado First
  5. Outros gatilhos ao nível da base de dados
  6. O gatilho ao nível da base de dados marcado Last

Considerações gerais sobre o desencadeamento

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

Se o mesmo gatilho tiver de ser designado como primeira ou última ordem para mais do que um tipo de instrução, sp_settriggerorder deve ser executado para cada tipo de instrução. Além disso, o gatilho deve primeiro ser definido para um tipo de instrução antes de poder ser designado como First o ou Last gatilho para disparar nesse tipo de instrução.

Permissions

Definir a ordem de um disparador DDL com o âmbito do servidor (criado ON ALL SERVER) ou um gatilho de login requer CONTROL SERVER permissão.

Definir a ordem de um disparador DDL com o âmbito da base de dados (criado ON DATABASE) requer ALTER ANY DATABASE DDL TRIGGER permissão.

Definir a ordem de um disparador DML requer ALTER permissão na tabela ou vista onde o disparador está definido.

Examples

A. Defina a ordem de disparo para um gatilho DML

O exemplo seguinte especifica que o gatilho uSalesOrderHeader é o primeiro a disparar após uma UPDATE operação ocorrer na Sales.SalesOrderHeader tabela.

USE AdventureWorks2022;
GO

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

B. Defina a ordem de disparo para um gatilho DDL

O exemplo seguinte especifica que o gatilho ddlDatabaseTriggerLog é o primeiro a disparar após um ALTER_TABLE evento ocorrer na AdventureWorks2025 base de dados.

USE AdventureWorks2022;
GO

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