Especificar o primeiro e o último gatilhos
É possível especificar que um dos gatilhos AFTER associados a uma tabela seja tanto o primeiro gatilho AFTER quanto o último gatilho AFTER, acionado para cada uma das ações de gatilho - INSERT, DELETE e UPDATE. Os disparadores AFTER que são acionados entre o primeiro e o último disparador são executados em ordem indefinida.
Para especificar a ordem para um gatilho AFTER, use o procedimento armazenado sp_settriggerorder. O sp_settriggerorder tem as seguintes opções:
Opção |
Descrição |
---|---|
First |
Especifica que o gatilho DML é o primeiro gatilho AFTER acionado para uma ação de gatilho. |
Last |
Especifica que o gatilho DML é o último gatilho AFTER acionado para uma ação de gatilho. |
None |
Especifica que não há nenhuma ordem específica na qual o gatilho DML deva ser acionado. Usado, principalmente, para redefinir um gatilho a ser o primeiro ou o último. |
O exemplo seguinte usa o sp_settriggerorder:
sp_settriggerorder @triggername = 'MyTrigger', @order = 'first', @stmttype = 'UPDATE'
Importante |
---|
O primeiro e o último gatilho devem ser dois gatilhos DML diferentes. |
Uma tabela pode definir os gatilhos INSERT, UPDATE, e DELETE para serem acionados ao mesmo tempo. Cada instrução pode ter seus próprios primeiros e últimos gatilhos, mas os gatilhos não podem ser os mesmos.
Caso o primeiro ou o último gatilho definido para uma tabela não abranja uma ação de gatilho, por exemplo, INSERT, DELETE e UPDATE, não haverá primeiro ou último gatilho para ações perdidas.
Gatilhos INSTEAD OF não podem ser especificados como primeiro ou último. Os gatilhos INSTEAD OF são acionados antes que as atualizações das tabelas subjacentes sejam feitas. Se as atualizações forem feitas pelo gatilho INSTEAD OF às tabelas subjacentes, as atualizações ocorrerão antes que qualquer gatilho AFTER, definido na tabela, seja acionado. Por exemplo, se um gatilho INSTEAD OF INSERT em uma exibição, inserir dados em uma tabela base e a tabela base tiver um gatilho INSTEAD OF INSERT e três gatilhos AFTER INSERT, o gatilho INSTEAD OF INSERT na tabela base, será acionado em vez da ação de inserção e os gatilhos AFTER na tabela base, serão acionados após qualquer ação de inserção na tabela base. Para obter mais informações, consulte Gatilhos DML.
Se uma instrução ALTER TRIGGER alterar o primeiro ou o último gatilho, os atributos Primeiro ou Último serão descartados e o valor do pedido será definido em Nenhum. O pedido deve ser redefinido usando o sp_settriggerorder.
A função OBJECTPROPERTY informa se um gatilho é do tipo primeiro ou último por meio das propriedades ExecIsFirstTrigger e ExecIsLastTrigger.
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 no gatilho de replicação ou usar sp_settriggerorder para alterar o gatilho de replicação para um último ou nenhum gatilho, a assinatura não funcionará corretamente.