Come verificare un trigger se l'intera riga rimane la stessa dopo un aggiornamento?


11

Ovviamente potrei farlo per ogni colonna confrontando così:

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

Ma sarebbe difficile e difficile da mantenere se aggiungessi un'altra colonna in futuro, per esempio.

C'è un modo per verificare se tutte le colonne rimangono uguali senza controllare manualmente ogni singola colonna?



Scusa ma come EXCEPT verrebbe utilizzato nel mio caso? Sto cercando di confrontare la vecchia riga con i nuovi valori di riga, da quello che so di EXCEPT viene utilizzato per confrontare le righe esistenti da due query, non nel vecchio / nuovo contesto di un trigger ...
Mateus Viccari,

Non ho familiarità con il tuo dbms- c'è un modo per selezionare nuovo. * Tranne selezionare vecchio. *? Se il conteggio delle righe = 0, nessuna riga è cambiata
Scott Hodgin,

Risposte:


15

Puoi semplicemente confrontare i record olde i newrecord con is not distinct fromcui gestisce correttamente i valori NULL (se tutte le colonne sono definite come NOT NULL puoi semplicemente usare =o <>)

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

Lo stesso può essere fatto per verificare se almeno una colonna è cambiata:

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

Come vengono gestiti i NULL da queste condizioni?
ypercubeᵀᴹ

@ ypercubeᵀᴹ: buon punto. Ho aggiornato la mia risposta.
a_horse_with_no_name

Thnx. Ho fatto un rapido controllo e sembra che old=newgestisca la custodia esattamente come old is not distinct from old. In altre parole, non sono riuscito a trovare un caso in cui old=newdia un risultato NULL. Non me l'aspettavo!
ypercubeᵀᴹ

Penso che la differenza sarebbe con old <> newma non sono del tutto sicuro.
a_horse_with_no_name
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.