Como verificar em um gatilho se a linha inteira permanece a mesma após uma atualização?


11

Claro que eu poderia fazê-lo para todas as colunas comparando assim:

if (old.column1 = new.column1 and old.column2 = new.column2...)

Mas seria codificado e difícil de manter se eu adicionar outra coluna no futuro, por exemplo.

Existe uma maneira de verificar se todas as colunas permanecem as mesmas sem verificar manualmente todas as colunas individualmente?



Desculpe, mas como EXCEPT seria usado no meu caso? Estou tentando comparar a linha antiga com os novos valores de linha, pelo que sei de EXCEPT, é usado para comparar linhas existentes de duas consultas, não no contexto antigo / novo de um gatilho ...
Mateus Viccari

Eu não estou familiarizado com o seu dbms - existe uma maneira de selecionar new. * Exceto select old. *? Se o número de linhas = 0, nenhuma linha foi alterada
Scott Hodgin

Respostas:


15

Você pode simplesmente comparar o olde os newregistros usando is not distinct fromque lida com valores nulos corretamente (se todas as colunas são definidas como NOT NULL você pode simplesmente usar =ou <>)

if old is not distinct from new then 
   .... do something
end if;

O mesmo pode ser feito para verificar se pelo menos uma coluna foi alterada:

if old is distinct from new then 
   .... do something
end if;

Como os NULLs são tratados por essas condições?
precisa saber é o seguinte

@ ypercubeᵀᴹ: bom ponto. Eu atualizei minha resposta.
A_horse_with_no_name 9/09/16

Thnx. Fiz uma verificação rápida e parece que old=newlida exatamente com o caso old is not distinct from old. Em outras palavras, não consegui encontrar um caso em que old=newdê um resultado NULL. Eu não esperava isso!
precisa saber é o seguinte

Eu acho que seria a diferença, old <> newmas não tenho certeza.
A_horse_with_no_name 9/09/16
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.