sp_settriggerorder (Transact-SQL)
Especifica os gatilhos AFTER que são acionados em primeiro ou último lugar. Os gatilhos AFTER que são acionados entre o primeiro e o último gatilho são executados em ordem indefinida.
Sintaxe
sp_settriggerorder [ @triggername = ] '[ triggerschema. ] triggername'
, [ @order = ] 'value'
, [ @stmttype = ] 'statement_type'
[ , [ @namespace = ] { 'DATABASE' | 'SERVER' | NULL } ]
Argumentos
[ @triggername= ] '[ triggerschema**.] triggername'**
É o nome do gatilho e do esquema ao qual ele pertence, se aplicável, cuja ordem será definida ou alterada. [triggerschema**.**]triggername é sysname. Se o nome não corresponder a um gatilho ou se o nome corresponder a um gatilho INSTEAD OF, o procedimento retornará um erro. triggerschema não pode ser especificado para gatilhos DDL ou de logon.[ @order= ] 'value'
É a configuração da nova ordem do gatilho. value é varchar(10) e pode ser qualquer um dos seguintes valores.Importante Os gatilhos First e Last devem ser dois gatilhos diferentes.
Valor
Descrição
First
O gatilho é acionado em primeiro lugar.
Last
O gatilho é acionado em último lugar.
None
O gatilho é acionado em ordem indefinida.
[ @stmttype= ] 'statement_type'
Especifica a instrução SQL que aciona o gatilho. statement_type é varchar(50) e pode ser INSERT, UPDATE, DELETE, LOGON ou qualquer evento de instrução Transact-SQL listado em Eventos DDL. Os grupos de eventos não podem ser especificados.Um gatilho pode ser designado como o gatilho First ou Last para um tipo de instrução somente depois que esse gatilho for definido como um gatilho para esse tipo de instrução. Por exemplo, o gatilho TR1 pode ser designado como First para INSERT na tabela T1 se TR1 estiver definido como um gatilho INSERT. O Mecanismo de Banco de Dados retornará um erro se TR1, que foi definido somente como um gatilho INSERT, estiver definido como um gatilho First ou Last para uma instrução UPDATE. Para obter mais informações, consulte a seção Comentários.
@namespace= { 'DATABASE' | 'SERVER' | NULL }
Quando triggername for um gatilho DDL, 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 escopo de gatilho DLL, consulte Criando gatilhos DDL. Se não especificado, ou se NULL for especificado, triggername será um gatilho DML.
Valores de código de retorno
0 (êxito) e 1 (falha)
Comentários
Disparadores DML
Pode haver um único gatilho First e um Last para cada instrução em uma única tabela.
Se um gatilho First já estiver definido na tabela, banco de dados ou servidor, não será possível designar um novo gatilho como First para a mesma tabela, banco de dados ou servidor para o mesmo statement_type. Esta restrição também é aplicada a gatilhos Last.
A replicação gera automaticamente um primeiro gatilho 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 gatilho em uma atualização imediata ou uma assinatura de atualização em fila. Se você tentar fazer com que um gatilho seja o primeiro 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 gatilho Last ou None, a assinatura não funcionará corretamente.
Gatilhos DDL.
Se um gatilho DDL com o escopo no banco de dados e um gatilho DDL com escopo no servidor existirem no mesmo evento, será possível especificar que ambos os gatilhos podem ser um gatilho First ou um gatilho Last. Entretanto, gatilhos com escopo no servidor sempre são acionados em primeiro lugar. Em geral, a ordem de execução de gatilhos DDL que existem no mesmo evento é a seguinte:
O gatilho do nível do servidor marcado como First.
Outros gatilhos do nível do servidor.
O gatilho do nível do servidor marcado como Last.
O gatilho do nível do banco de dados marcado como First.
Outros gatilhos do nível do banco de dados.
O gatilho do nível do banco de dados marcado como Last.
Considerações gerais sobre gatilhos
Se uma instrução ALTER TRIGGER alterar um primeiro ou último gatilho, o atributo First ou Last originalmente definido no gatilho será descartado e o valor será substituído por None. O valor de ordem 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 deverá ser executado para cada tipo de instrução. Além disso, o gatilho deve ser primeiramente definido para um tipo de instrução antes de ser designado como o gatilho First ou Last a ser acionado para esse tipo de instrução.
Permissões
A definição da ordem de um gatilho DDL com escopo no servidor (criado ON ALL SERVER) ou um gatilho de logon requer permissão CONTROL SERVER.
A definição da ordem de um gatilho DDL com escopo no banco de dados (criado ON DATABASE) requer permissão ALTER ANY DATABASE DDL TRIGGER.
A definição da ordem de um gatilho DML requer permissão ALTER na tabela ou exibição na qual o gatilho está definido.
Exemplos
A. Definindo a ordem de acionamento para um gatilho DML
O exemplo a seguir especifica que o gatilho uSalesOrderHeader será o primeiro gatilho a ser acionado depois que uma operação UPDATE ocorrer na tabela Sales.SalesOrderHeader.
USE AdventureWorks;
GO
sp_settriggerorder @triggername= 'Sales.uSalesOrderHeader', @order='First', @stmttype = 'UPDATE';
B. Definindo a ordem de acionamento para um gatilho DDL
O exemplo a seguir especifica que o gatilho ddlDatabaseTriggerLog será o primeiro gatilho a ser acionado depois que um evento ALTER_TABLE ocorrer no banco de dados AdventureWorks.
USE AdventureWorks;
GO
sp_settriggerorder @triggername= 'ddlDatabaseTriggerLog', @order='First', @stmttype = 'ALTER_TABLE', @namespace = 'DATABASE';