Post rápido depois de meses de inércia e blog fora do ar, agora sob novo domínio!

Surgiu uma dúvida onde eu trabalho e eu achei interessante postar aqui um caso de exemplo para futura referência.

A questão: “Se eu fizer um update em uma coluna, mas usando o mesmo valor, o SQL executa a trigger, ok. Mas a função UPDATE(coluna) é validada? O SQL não é inteligente o suficiente para ignorar o update, uma vez que o campo é o mesmo?”

Se quiser parar por aqui, a resposta é um singelo e simples: Não.

Agora, se quiser ver o caso funcionando… 

Vamos começar criando duas tabelas e uma trigger na primeira, onde ele irá unicamente validar se uma das colunas está sendo atualizada e, em caso positivo, realizará um update na segunda tabela.

Em tempo: Não vou perder tempo criando PK, FK e etc, pois não é o intuito, imaginem que está tudo aqui como manda o figurino.

use tempdb
go
create table tabela1 (a int, b char(2))
create table tabela2 (d int, f datetime)
GO
create trigger trTabela1 on tabela1
after update as
begin
  update tb2
  set f = (case when update(b) then getdate() end)
  from tabela2 tb2
  join inserted tb1
  on tb2.d = tb1.a
end
GO
insert into tabela1 values (1,'aa'),(2,'bb'),(3,'cc')
insert into tabela2 values (1,getdate()),(2,getdate()),(3,getdate())
GO
select * 
from tabela1 t1
join tabela2 t2
on t1.a = t2.d
![](/images/2017/05/trigger1.png)
Ok, até aí, nada demais…

Agora, vamos rodar o update e ver o que acontece….

update tabela1
set b = 'bb' 
where a = 2
go
select * 
from tabela1 t1
join tabela2 t2
on t1.a = t2.d

Bom… Fica aí a dica então… Mesmo que você atualize um campo para o mesmo valor, a função é validada.

PS: Ah, você está se perguntando porque eu faria um update de um campo para o mesmo valor? O Entity Framework mandou lembranças…. Mas isso é um post para um outro blog, não este. 🙂