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
, , LOGON
DELETE
, 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:
- O gatilho no nível do servidor marcado
First
- Outros gatilhos no nível do servidor
- O gatilho no nível do servidor marcado
Last
- O gatilho no nível do banco de dados marcado
First
- Outros gatilhos no nível do banco de dados
- 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';
Conteúdo relacionado
Comentários
https://aka.ms/ContentUserFeedback.
Brevemente: Ao longo de 2024, vamos descontinuar progressivamente o GitHub Issues como mecanismo de feedback para conteúdos e substituí-lo por um novo sistema de feedback. Para obter mais informações, veja:Submeter e ver comentários