2017-09-25 1 views
0

j'ai une base de données avec deux tables A et B. A est beaucoup plus grand que B.PostgreSQL - Trigger après l'importation

de certains critères spécifiques, j'ai vue construit à partir des enregistrements de la table A. Appelons V a.

Une deuxième vue, V V un -B, est la différence bewteen enregistrements qui se trouvent sur V un et B (tous les enregistrements sur V un qui ne sont pas dans B). V est une taille supérieure ou égale à B.

Les deux tables, A et B, ont la même structure de colonnes, sauf une, un numéro de série. Les données sont chargées dans ces tables via l'importation à partir d'un fichier CSV. Une colonne remplit automatiquement la date à laquelle chaque enregistrement a été créé. Les importations devraient être mensuelles.

Le problème: Je dois mettre à jour les dossiers du tableau A qui existent en V V un -B, récemment créé (qui est, après l'importation de nouvelles données en A et B) et ont un champ comme NULL (je suppose que peu importe lequel). La fonction de déclenchement doit rechercher si chaque élément de V V -B a une copie exacte du mois précédent. Si c'est le cas, la valeur du champ doit être copiée de l'ancien enregistrement vers le nouveau. Sinon, une valeur prédéfinie est écrite.

Parce que V V un -B dépend à la fois A et B, je ne sais pas où mettre la gâchette. Si je le mets sur A, la vue n'aura pas encore toutes les données. Si je le mets sur B, comment puis-je m'assurer qu'il ne se répète pas plus d'une fois par importation? Serait-ce une meilleure idée d'utiliser une procédure stockée (fonction) manuellement?

Merci.

EDIT: ajout « chaque élément récemment créé » pour la clarification, le déclencheur n'a pas à faire défiler tous les enregistrements V V un -B chaque fois, seulement ceux ajoutés récemment.

+0

La valeur NULL n'est pas une valeur, elle ne peut donc pas être une valeur pour une clé primaire. – wildplasser

Répondre

0

Si vous pouvez écrire un déclencheur qui modifie les enregistrements nécessaires dans A chaque fois qu'une ligne dans A (ou B) a été modifiée, vous pouvez écrire un déclencheur (ou deux) pour effectuer l'opération. Les vues refléteront immédiatement les changements dans les tableaux, si cela vous concerne.

Mais cette solution n'est louable que si la fonction de déclenchement n'est pas chère – elle sera exécutée pour chaque ligne modifiée.

Si vous ne pouvez pas écrire facilement une fonction de déclenchement simple qui fait l'affaire, la meilleure solution est d'introduire une étape de post-traitement après que A et B aient été modifiés.