Comment archiver un déclencheur si la ligne entière reste la même après une mise à jour?

10

Bien sûr, je pourrais le faire pour chaque colonne en comparant comme ceci:

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

Mais ce serait codé en dur et difficile à maintenir si j'ajoute une autre colonne à l'avenir, par exemple.

Existe-t-il un moyen de vérifier si toutes les colonnes restent identiques sans vérifier manuellement chaque colonne individuellement?

Mateus Viccari
la source
Pouvez-vous utiliser SAUF - techonthenet.com/postgresql/except.php
Scott Hodgin
Désolé mais comment EXCEPT serait utilisé dans mon cas? J'essaie de comparer l'ancienne ligne avec les nouvelles valeurs de ligne, d'après ce que je sais, sauf qu'elle est utilisée pour comparer les lignes existantes de deux requêtes, pas dans le contexte ancien / nouveau d'un déclencheur ...
Mateus Viccari
Je ne connais pas votre dbms - existe-t-il un moyen de sélectionner nouveau. * Sauf l'ancien. *? Si le nombre de lignes = 0, aucune ligne n'a été modifiée
Scott Hodgin

Réponses:

15

Vous pouvez simplement comparer les oldet les newenregistrements en utilisant is not distinct fromcorrectement qui gère les valeurs NULL (si toutes les colonnes sont définies comme NOT NULL , vous pouvez simplement utiliser =ou <>)

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

La même chose peut être faite pour vérifier si au moins une colonne a changé:

if old is distinct from new then 
   .... do something
end if;
un cheval sans nom
la source
Comment les NULL sont-ils gérés par ces conditions?
ypercubeᵀᴹ
@ ypercubeᵀᴹ: bon point. J'ai mis à jour ma réponse.
a_horse_with_no_name
Thnx. J'ai fait une vérification rapide et semble que old=newle cas est exactement comme celui-là old is not distinct from old. En d' autres termes, je ne pouvais pas trouver un cas où old=newdonne un résultat NULL. Je ne m'attendais pas à ça!
ypercubeᵀᴹ
Je pense que la différence serait avec old <> newmais je ne suis pas tout à fait sûr.
a_horse_with_no_name