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?



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;

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.