Tenho experiência em Oracle/PostgreSQL e tenho dificuldade em lidar com os limites da implementação de trigger do SQL Server.
Desejo atualizar duas datetime
colunas diferentes se o valor de uma coluna diferente for alterado. Isso é para registrar duas alterações de status específicas da linha.
Agora o SQL Server não possui gatilhos de nível de linha nem before update
gatilhos. Portanto, meu entendimento é que preciso ingressar em inserir e excluir para descobrir se e qual alteração de status ocorreu e, em seguida, executar uma atualização "regular" na tabela que está sendo atualizada.
Meu gatilho atualmente se parece com isso:
create trigger ord_status_history_trigger
on jobs
AFTER UPDATE
AS
IF ( UPDATE(order_status) )
BEGIN
update jobs
set transfercomplete = case
when o.order_status = 'initial' and n.order_status = 'sent' then current_timestamp
else n.transfercomplete
end,
installcomplete = case
when o.order_status = 'delivered' n.order_status = 'installed' then current_timestamp
else n.installcomplete
end
from inserted n
join deleted o on o.jobid = n.jobid
join jobs aj on aj.jobid = n.jobid;
END
Minha dúvida é: essa trigger resulta efetivamente em duas atualizações na tabela?
A primeira sendo a atualização do acionador e a segunda sendo aquela executada pelo acionador?
Ou o SQL Server é inteligente o suficiente para mesclar isso em uma única atualização na tabela base (essencialmente da maneira como acontece com, por exemplo, um BEFORE UPDATE
gatilho no PostgreSQL)
Eu crio um potencial gargalo de desempenho aqui?
Poderíamos definir esses carimbos de data/hora de dentro do aplicativo também, mas seria melhor se pudéssemos delegar isso ao banco de dados, para que possamos ter certeza de que isso nunca será esquecido.
Seu gatilho é executado após as atualizações terem ocorrido na tabela. Se você atualizar a tabela novamente na trigger uma nova atualização é realizada. Veja também a discussão sobre RECURSIVE_TRIGGERS .
Se você deseja executar o código antes da atualização, terá que criar um gatilho INSTEAD OF .
Se ter que fazer duas atualizações em vez de uma se tornará o gargalo depende inteiramente da eficiência da atualização em seu gatilho e, claro, se esta ATUALIZAÇÃO já está no caminho crítico ou não. Você provavelmente tem uma chave primária no ID do trabalho, as páginas estão quentes no buffer pool e você não pode ter conflitos de bloqueio. Então, basicamente, está sujeito apenas a a) a rapidez com que seu log pode aceitar gravações eb) se o armazenamento de versão (que atende às pseudotabelas excluídas e inseridas) pode acompanhar.
Se você me perguntar: essa manutenção de status de lógica de negócios pertence ao aplicativo, não a uma trigger...