Au sein d'une fonction de déclenchement, comment obtenir les champs qui sont en cours de mise à jour
Est-ce possible? Je suis intéressé à trouver les colonnes qui ont été spécifiées dans la UPDATE
demande indépendamment du fait que la nouvelle valeur qui est envoyé, ce qui peut ou peut ne pas être ce qui est stocké dans la base de données déjà.
La raison pour laquelle je veux faire, c'est parce que nous avons une table qui peut recevoir des mises à jour à partir de sources multiples. Auparavant, nous n'étions pas d'enregistrement de la source de la mise à jour était originaire. Maintenant la table stocke la source qui a effectué la dernière mise à jour. Nous pouvons modifier certaines des sources d'envoyer un identifiant, mais ce n'est pas une option pour tout le. Donc j'aimerais être capable de reconnaître quand un UPDATE
demande de ne pas disposer d'un identifiant afin que je puisse remplacer une valeur par défaut.
Vous devez vous connecter pour publier un commentaire.
Si une "source" n'est pas "envoyer l'identifiant", la colonne sera inchangé. Ensuite, vous ne peut pas détecter si le courant
UPDATE
a été fait par la même source que le dernier ou par une source qui n'a pas changé la colonne à tous. En d'autres termes: cela ne fonctionne pas correctement.Si la "source" est identifiable par tout les informations de session de la fonction, vous pouvez travailler avec. Comme:
Inconditionnellement à chaque mise à jour.
Solution Générale
J'ai trouvé un moyen de résoudre le problème d'origine. La colonne est définie à une valeur par défaut dans tout mise à jour lorsque la colonne est pas mis à jour (pas dans le
SET
liste desUPDATE
).Élément clé est un par déclencheur de colonne introduit dans PostgreSQL 9.0 - une colonne spécifique de déclenchement à l'aide de la
UPDATE OF
column_name
clause.C'est la seule manière simple que j'ai trouvé pour distinguer si une colonne a été mis à jour avec une nouvelle valeur identique à l'ancien, contre pas mis à jour à tous.
Un pourrait également analyser le texte retourné par
current_query()
. Mais cela semble difficile et peu fiable.Déclencher des fonctions
Je suppose une colonne
col
définiNOT NULL
.Étape 1: Ensemble
col
àNULL
si inchangée:Étape 2: Revenir à l'ancienne valeur. Déclenchement de seulement d'être congédié, si la valeur a été effectivement mises à jour (voir ci-dessous):
Étape 3: Maintenant, nous pouvons identifier le manque de mise à jour et de définir une valeur par défaut à la place:
Déclenche
Le déclencheur pour Étape 2 est déclenché par colonne!
Déclencher des noms sont pertinents, car ils sont placés dans l'ordre alphabétique (toutes
BEFORE UPDATE
)!La procédure peut être simplifiée avec quelque chose comme "par-pas-colonne déclencheurs" ou de tout autre moyen de vérifier la cible d'une
UPDATE
dans un déclencheur. Mais je ne vois pas de poignée pour cela.Si
col
peut êtreNULL
, l'utilisation de tout autre "impossible" valeur intermédiaire et de vérifierNULL
en outre, en fonction de déclenchement 1:Adapter le reste en conséquence.
NEW
etOLD
sont visibles. Je ne vois aucune façon de distinguer le cas où une colonne est mise à jour avec la même valeur, dans le cas où il est mis à jour toutes les. Faites-vous?pl/perl
nous pouvons vérifierexists $NEW{ foo }
. Leexists
perl mot-clé pour vérifier si la cléfoo
existe à l'objet/hachage$NEW
. Il sera de retourtrue
même si$NEW{ foo } is undefined undef
(NULL)En plpgsql vous pourriez faire quelque chose comme ceci dans votre fonction de déclenchement:
column
puis votre code ne fonctionnera que si la déclaration a été commeUPDATE table SET column = null, data_col=...
Mais cela nécessiterait l'adoption du code de l'interlocuteur n'a pas accès.J'ai obtenu une autre solution au problème similaire, presque naturellement, parce que ma table contient une colonne avec la sémantique de la "dernière mise à jour le timestamp' (appelons cela UPDT).
Donc, j'ai décidé d'inclure de nouvelles valeurs de la source et de UPDT dans toute mise à jour seulement à la fois (ou aucune). Depuis UPDT est destiné à changer à chaque mise à jour, avec une telle politique, on peut utiliser une condition
new.UPDT = old.UPDT
à déduire qu'aucune source n'a été spécifié avec la mise à jour actuelle et la remplacer celui par défaut.Si l'on possède déjà la dernière mise à jour le timestamp' colonne, dans son tableau, cette solution est plus simple, que la création de trois déclencheurs. Pas sûr si c'est une meilleure idée de créer UPDT, quand il n'est pas nécessaire déjà. Si des mises à jour sont si fréquentes qu'il y a risque d'horodatage similitude, un séquenceur peut être utilisé à la place de timestamp.