sp_settriggerorder (Transact-SQL)

Especifica os disparadores 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.

Ícone de vínculo de tópicoConvenções de sintaxe Transact-SQL

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 disparador ou se o nome corresponder a um disparador INSTEAD OF, o procedimento retornará um erro. triggerschema não pode ser especificado para disparadores DDL ou de logon.

  • [ @order= ] 'value'
    É a configuração da nova ordem do disparador. value é varchar(10) e pode ser qualquer um dos seguintes valores.

    Observação importanteImportante

    Os disparadores First e Last devem ser dois disparadores diferentes.

    Valor

    Descrição

    First

    O disparador é acionado em primeiro lugar.

    Last

    O disparador é acionado em último lugar.

    None

    O disparador é acionado em ordem indefinida.

  • [ @stmttype= ] 'statement_type'
    Especifica a instrução SQL que aciona o disparador. 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 disparador pode ser designado como o disparador First ou Last para um tipo de instrução somente depois que esse disparador for definido como um disparador para esse tipo de instrução. Por exemplo, o disparador TR1 pode ser designado como First para INSERT na tabela T1 se TR1 estiver definido como um disparador INSERT. O Mecanismo de Banco de Dados retornará um erro se TR1, que foi definido somente como um disparador INSERT, estiver definido como um disparador 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 disparador DDL, especifica se triggername foi criado com escopo de banco de dados ou escopo de servidor. Se triggername for um disparador de logon, SERVER deverá ser especificado. Para obter mais informações sobre escopo de disparador DLL, consulte Criando gatilhos DDL. Se não especificado, ou se NULL for especificado, triggername será um disparador DML.

Valores de código de retorno

0 (êxito) e 1 (falha)

Comentários

Disparadores DML

Pode haver um único disparador First e um Last para cada instrução em uma única tabela.

Se um disparador First já estiver definido na tabela, banco de dados ou servidor, não será possível designar um novo disparador como First para a mesma tabela, banco de dados ou servidor para o mesmo statement_type. Esta restrição também é aplicada a disparadores Last.

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 disparador seja o primeiro disparador. 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 fazer com que um disparador seja o primeiro depois que uma tabela for incluída em uma assinatura, sp_settriggerorder retornará um erro. Se você usar ALTER TRIGGER no disparador de replicação ou usar sp_settriggerorder para alterar o disparador de replicação para um disparador Last ou None, a assinatura não funcionará corretamente.

Disparadores DDL.

Se um disparador DDL com o escopo no banco de dados e um disparador DDL com escopo no servidor existirem no mesmo evento, será possível especificar que ambos os disparadores podem ser um disparador First ou um disparador Last. 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 disparador do nível do servidor marcado como First.

  2. Outros disparadores do nível do servidor.

  3. O disparador do nível do servidor marcado como Last.

  4. O disparador do nível do banco de dados marcado como First.

  5. Outros disparadores do nível do banco de dados.

  6. O disparador do nível do banco de dados marcado como Last.

Considerações gerais sobre disparadores

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

Se o mesmo disparador 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 disparador deve ser primeiramente definido para um tipo de instrução antes de ser designado como o disparador First ou Last a ser acionado para esse tipo de instrução.

Permissões

A definição da ordem de um disparador DDL com escopo no servidor (criado ON ALL SERVER) ou um disparador de logon requer permissão CONTROL SERVER.

A definição da ordem de um disparador 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 disparador DML requer permissão ALTER na tabela ou exibição na qual o disparador está definido.

Exemplos

A. Definindo a ordem de acionamento para um disparador DML

O exemplo a seguir especifica que o disparador uSalesOrderHeader será o primeiro disparador a ser acionado depois que uma operação UPDATE ocorrer na tabela Sales.SalesOrderHeader.

USE AdventureWorks2008R2;
GO
sp_settriggerorder @triggername= 'Sales.uSalesOrderHeader', @order='First', @stmttype = 'UPDATE';

B. Definindo a ordem de acionamento para um disparador DDL

O exemplo a seguir especifica que o disparador ddlDatabaseTriggerLog será o primeiro disparador a ser acionado depois que um evento ALTER_TABLE ocorrer no banco de dados AdventureWorks2008R2.

USE AdventureWorks2008R2;
GO
sp_settriggerorder @triggername= 'ddlDatabaseTriggerLog', @order='First', @stmttype = 'ALTER_TABLE', @namespace = 'DATABASE';