Question

J'ai une très grande base de données (fonctionnant sur PostgreSQL) contenant un grand nombre de tables avec des relations sophistiquées entre elles (clés étrangères, sur la suppression en cascade, etc.). J'ai besoin de supprimer des données d'un certain nombre de tables, mais je ne suis pas sûr de la quantité de données qui sera réellement supprimée de la base de données en raison des suppressions en cascade.

Comment puis-je vérifier que je ne supprime pas les données qui ne doivent pas être supprimées?

J'ai une base de données de test - juste une copie d'une vraie où je peux faire ce que je veux :))

La seule idée que j'ai est de dump de la base de données avant et après et de la vérifier. Mais ça n'a pas l'air confortable. Une autre idée - supprimer une partie de la base de données, qui, à mon avis, ne devrait pas être affectée par mes instructions DELETE et vérifier cette partie avant et après la suppression des données. Mais je ne vois pas de moyen simple de le faire (il existe des centaines de tables et leur suppression devrait fonctionner avec environ 10 d’entre elles). Y a-t-il un moyen de le faire?

Avez-vous d'autres idées sur la façon de résoudre le problème?

Était-ce utile?

La solution

Vous pouvez interroger la classe information_schema pour dessiner vous-même la définition des contraintes dans la base de données. Ensuite, vous saurez ce qui va se passer lorsque vous supprimez. Cela sera utile non seulement dans ce cas, mais toujours.

Quelque chose comme (pour les contraintes)

select table_catalog,table_schema,table_name,column_name,rc.* from
information_schema.constraint_column_usage ccu, 
information_schema.referential_constraints rc 
where ccu.constraint_name = rc.constraint_name

Autres conseils

À l’aide de psql, démarrez une transaction, effectuez vos suppressions, puis exécutez toutes les requêtes de vérification auxquelles vous pouvez penser. Vous pouvez ensuite annuler ou commettre.

Si l’inquiétude est de laisser les clés en suspens (c'est-à-dire: pointant sur un enregistrement supprimé), exécutez la suppression sur votre base de test, puis utilisez des requêtes pour rechercher les clés qui pointent maintenant vers des cibles non valides. (Pendant ce temps, vous pouvez également vous assurer que la partie qui ne devrait pas être affectée ne change pas.)

Une meilleure solution serait de passer du temps à cartographier les cascades de suppression afin de savoir à quoi s'attendre. Il est très utile de savoir comment votre base de données fonctionne. Les efforts consacrés à cette opération seront donc utiles au-delà de cette suppression.

Et peu importe à quel point vous êtes sûr de revenir à la base de données avant de faire de gros changements!

Merci pour vos réponses!

Vinko, ta réponse m’est très utile et j’étudierai cela au quotidien.

En fait, dans mon cas, il suffisait de comparer le nombre de tables avant et après la suppression d'enregistrements et de vérifier quelles tables étaient affectées.

cela a été fait à l'aide de commandes simples décrites ci-dessous

psql -U U_NAME -h`hostname` -c '\d' | awk '{print $3}' > tables.list

for i in `cat tables.list `; do echo -n "$i: " >> tables.counts; psql -U U_NAME -h`hostname` -t -c "select count(*) from $i" >> tables.counts; done

for i in `cat tables.list `; do echo -n "$i: " >> tables.counts2; psql -U U_NAME -h`hostname` -t -c "select count(*) from $i" >> tables.counts2; done

diff tables.counts tables.counts2
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top