Se recebermos uma declaração de atualização que não verifica se o valor foi alterado na cláusula where, quais são as diferentes maneiras de ignorar essa atualização dentro de um gatilho?
Sei que podemos fazer uma comparação de cada campo individual (lidando também com o lado ISNULL), mas onde é uma tabela com mais de 50 campos, existe uma maneira mais rápida/fácil de fazer isso?
Observação: isso pode ser usado para reduzir IO/ruído em registros de auditoria, etc...
EXEMPLO
Para uma tabela de:
CREATE TABLE myTest
(ID int NOT NULL IDENTITY(1,1),
Field1 varchar(10) NULL,
Field2 varchar(20) NULL)
com um acionador do atualizador posterior contendo:
INSERT INTO myTestAudit (ID, Field1, Field2, DateTimeUpdate)
SELECT ID, Field1, Field2, getDate()
FROM inserted
com valores iniciais:
INSERT INTO myTest (Field1, Field2)
SELECT 'a', 'b' UNION ALL
SELECT 'a', 'c'
Agora execute uma atualização:
UPDATE myTest set Field2 = 'b' WHERE Field1 = 'a'
Para trazer de volta as linhas onde pelo menos um valor foi alterado, você pode usar
Coloque isso como a primeira linha do seu gatilho:
Eu faço isso em todos os meus gatilhos de auditoria. É curto e direto ao ponto, definitivamente reduz o desperdício de I/O.
Atualização: Desculpe, eu interpretei mal a sua pergunta. Achei que você perguntou como sair do gatilho se nenhum dado foi alterado.