7
votes

Dupliquer le schéma PostgreSQL, y compris les séquences

My Datey Layout doit créer un nouveau schéma pour chaque nouveau client. Actuellement, j'utilise la fonction interne que j'ai trouvée sur le net et j'ai modifié un peu. XXX

Le problème avec ce script est que les tables du nouveau schéma continuent d'utiliser les séquences de Schema Source. Y a-t-il bien d'utiliser des instructions SQL (ou d'une autre manière fiable) pour obtenir de nouvelles copies de séquences (ou même une autre manière fiable de dupliquer tout le schéma complet) pour les tables nouvellement créées?


4 commentaires

Schema-Per-Client ne peut pas être un modèle idéal à utiliser. En tout cas, ma réaction de gut serait d'essayer de faire piger quelque chose en fonction de la base de données Créer ... ou pg_dump. En fait, vous devriez peut-être simplement simplifier et commettre un modèle de type .sql du schéma et chargez-le. Essayer de templatiser un schéma en direct semble être un kilométrage.


C'est la meilleure chose à faire pour la mise en page de la base de données que j'ai trouvée, car chaque client peut avoir des données sensibles là-bas. Ce serait un problème de sécurité assez important stocker toutes les données dans une base de données unique. Toutes les demandes de données sont normalisées et le schéma ne contient que des données pertinentes du client.


Si vous utilisez différentes bases de données de toute façon, il sera beaucoup plus facile si vous créez une base de données de modèle (c'est-à-dire une base de données vide avec uniquement les tables) et utilisez uniquement la base de données Créer ... < / code> comme suggéré par Frank


Il existe également des données communes stockées dans le schéma public utilisé dans une application.


3 Réponses :


6
votes

La racine du problème

La connexion à l'ancienne séquence provient d'une valeur par défaut unie pour la colonne impliquée. Je cite Le manuel ici : P>

expressions par défaut pour les définitions de colonne copiée ne sera que copié si y compris les valeurs par défaut code> est spécifié. Le comportement par défaut est de exclure les expressions par défaut, entraînant les colonnes copiées de la Nouvelle table ayant NULL par défaut. P> blockquote>

puisque vous créez de nouvelles tables avec p> xxx pré>

et: p>

y compris tout code> est une forme abrégée de y compris les valeurs par défaut, y compris Contraintes, y compris les index, y compris le stockage, y compris les commentaires code>. P> BlockQuote>

.. Vous obtenez la même valeur par défaut. Vous pouvez exclure des valeurs par défaut ou modifier explicitement les valeurs par défaut, y compris NextVal () code> pour les nouvelles tables après leur avoir créée. Je ne pense pas qu'il y ait un terrain d'entente. P>


plus simple avec Dump / Hack the Dump / Restaure H3>

ou même une autre manière fiable de dupliquer tout le schéma p> blockQuote>

Vous pouvez vider le schéma du schéma (même mot, différent de la signification) avec pg_dump code>: p> xxx pré>

pirater le décharge ( Signification: Utilisez un éditeur de texte sur celui-ci, ou Script IT): Échangez le nom du schéma en haut de la députée, ainsi que toutes les autres occurrences de Set Search_Path CODE> et comme schéma-qualification pour les séquences et éventuellement plus. Si vous avez choisi un nom unique em> pour le schéma, une seule série de recherches globales et remplacez avec votre outil préféré ( sed code> ou vim code> ou .. .) Devrait faire le travail. p>

puis exécutez le script SQL avec psql code> contre la même ou une autre base de données: p>

ALTER SEQUENCE seq OWNED BY tbl.col;


7 commentaires

On dirait que la voie à suivre et à créer des séquences et à modifier les champs de clés primaires, car la perte de valeur par défaut est le prix ne vaut pas la peine d'être payé.


@icebreaker: Ou vous essayez l'itinéraire complètement différent que j'ai décrit dans ma mise à jour.


A regardé mon dernier dépôt de base de données (PostgreSQL version 9.1.5) - a trouvé ce ID INTEGER par défaut NextVal ('Company_1.Branches_id_seq' :: regclass) non null pas ID Serial . ..


@ Erwin-Brandstter: Il semble actuellement que je disposerai d'une vidange optimisée pour multiplier les schémas.


@icebreaker: Avez-vous mis à niveau cette base de données d'une version plus ancienne?


@ Erwin-Brandsetter: Non. Actuellement, toutes mes machines partagent la même version OS et PostgreSQL. Mais je pense que cela pourrait être un problème sur mon serveur de production, car il exécute actuellement 8.4


@icebreaker: J'ai couru des tests et j'ai trouvé que mes déclarations précédentes sur les colonnes en série dans la décharge étaient en partie incorrectes. Je me suis trompé de scripts dans les fonctions PLPGSQL dans la décharge qui ont des scripts de création avec des colonnes en série . J'ai modifié ma réponse en conséquence.



5
votes

Et ainsi après une pensée, je suis allé avec la mise à jour de la fonction SQL mentionnée dans mon premier message, alors cela ressemble maintenant à ceci: xxx

Ce n'est pas une solution universelle pour tout le monde, mais comme tout mes tables dans le schéma ont un champ de série nommé ID, cela me convient.

Version suggérée par @ @ Erwin-Brandsetter avec Dump / Hack Dump Fichier / Restaurer le fichier de vidage à nouveau est communément observé sur les forums comme le moyen de Go.

En cas de serveur dédié, cela pourrait fonctionner, en cas d'hébergement partagé (ou de moins de dépendances sur les scripts extérieurs), le mode de fonctionnement interne semble mieux.


2 commentaires

Vous voudrez peut-être ajouter alter séquence SEQ appartenant à tbl.col comme je l'ai mentionné dans ma réponse mise à jour. C'est ce que faire une colonne Serial .


@ Erwin-Brandstter: Créer une séquence SEQ appartenant à tbl.col fait la même chose que je comprends.



2
votes

Vous pouvez simplement sauvegarder le schéma, puis renommez-le dans la DB, puis restaurer le fichier sauvegardé.


3 commentaires

Comment automatiser?


Vous pouvez l'automatiser par une combinaison de scripts SQL et de bash


Je n'ai pas vu ton point première fois je l'ai lu. Première sauvegarde, renommer avec SQL puis restaurer le schéma source ... sonne utilisable dans certains cas.