Les suppressions en cascade dans PostgreSQL
J'ai une base de données avec quelques dizaines de tables imbriquées avec les clés étrangères. Dans des circonstances normales, je veux que le défaut ON DELETE RESTRICT
comportement de ces contraintes. Mais lorsque j'essaie de partager un instantané de la base de données avec un consultant, j'ai besoin de supprimer des données sensibles. Je souhaite que mon mémoire d'un DELETE FROM Table CASCADE
commande n'avait pas été en pure hallucination.
Ce que j'ai à faire, cela a été un dump de la base de données, l'écriture d'un script pour traiter le dump en ajoutant ON DELETE CASCADE
clauses aussi toutes les contraintes de clés étrangères, de la restauration, l'exécution de mon supprime, le dumping de nouveau, le retrait de la ON DELETE CASCADE
, et enfin la restauration de nouveau. C'était plus facile que d'écrire la suppression de la requête que j'avais eu besoin de le faire en SQL -- suppression de l'ensemble des tranches de la base de données n'est pas un fonctionnement normal, de sorte que le schéma n'est pas exactement adaptés.
Quelqu'un aurait-il une meilleure solution pour la prochaine fois que quelque chose comme cela vient?
OriginalL'auteur | 2008-09-05
Vous devez vous connecter pour publier un commentaire.
Vous n'avez pas besoin de dump et restore. Vous devriez être en mesure de simplement supprimer la contrainte, de la reconstruire avec cascade, faire vos suppressions, de le déposer à nouveau, et de le reconstruire, en limiter.
OriginalL'auteur Grant Johnson
Vous pouvez créer des contraintes de clé étrangère comme non urgent. Alors vous seriez en mesure de désactiver temporairement pendant que vous frottez les données et de les réactiver lorsque vous avez terminé. Jetez un oeil à cette question.
OriginalL'auteur agnul
Je suis un Postgres novice, donc je ne suis pas sûr de ce que le compromis est pour TRONQUER vs DROP.
OriginalL'auteur user362911
Vous voudrez peut-être chercher dans l'aide de les schémas avec PostgreSQL. J'ai fait cela dans le passé, des projets pour permettre à différents groupes de personnes ou les développeurs disposent de leurs propres données. Ensuite, vous pouvez utiliser vos scripts pour créer plusieurs copies de votre base de données en vue de telles situations.
OriginalL'auteur Tony Lenzi
@Tony: Non, les schémas peuvent être utiles, et en effet, nous les utilisons pour la partition de données dans notre base de données. Mais je parle d'essayer de frotter les données sensibles avant de permettre à un consultant d'avoir une copie de la db. Je veux que les données disparu.
OriginalL'auteur
Je ne pense pas que vous auriez besoin de traiter le fichier de vidage comme ça. Faire un streaming dump/restore, et un processus. Quelque chose comme:
où vous stockez tous vos SUPPRIMER sql delete-sensibles.sql. Le sanitizeddb base de données/mesures peuvent être supprimés si vous n'avez pas l'esprit le consultant à obtenir une db avec CASCADE clés étrangères au lieu de RESTREINDRE les clés étrangères.
Il peut également y avoir de meilleures façons en fonction de combien de fois vous avez besoin pour ce faire, la taille de la base de données est, et quel est le pourcentage de données est sensible, mais je ne peux pas penser à un moyen plus simple de le faire une fois ou deux fois par pour un de taille raisonnable base de données. Vous auriez besoin d'une base de données différente, après tout, de sorte que si vous avez déjà un cluster slony, ne peut pas éviter le dump/restore cycle, ce qui peut prendre beaucoup de temps.
OriginalL'auteur angch
TRONQUER supprime juste les données de la table et quitte la structure
OriginalL'auteur Tim Davis