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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
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 |
Agora, vamos rodar o update e ver o que acontece….
1 2 3 4 5 6 7 8 |
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. 🙂