sp_settriggerorder (Transact-SQL)
Aplica-se a: SQL ServerBanco 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:
- O gatilho no nível do servidor marcado como
First
- Outros gatilhos no nível do servidor
- O gatilho no nível do servidor marcado como
Last
- O gatilho no nível do banco de dados marcado como
First
- Outros gatilhos no nível do banco de dados
- 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';