Vous n'êtes pas identifié(e).
Pages : 1
Bonjour,
Je dois transférer des tables existantes dans différentes bases, mais à chaque fois placées dans le schéma public, dans une nouvelle base sur le même serveur contenant quant à elle, plusieurs schémas.
Par exemple, j'ai une table "communes" dans le schéma public de la base "refs" que je dois transférer avec ses données dans le schéma "refs" de la base "bdd". Idem avec une table "courses" dans le schéma public de la base "sports" que je dois transférer dans le schéma "sports" de la base "bdd", etc.
Il faut bien sûr que lors de ce transfert, je ne perde pas les contraintes de clés étrangères, les séquences, les triggers...
Je débute sous PostgreSQL, les plus expérimentés de ce forum pourraient-ils me venir en aide pour réaliser cette opération ?
J'ai fait des recherches sur le net au préalable sans réussir à trouver un cas similaire au mien, ni parvenir à adapter des commandes de cas proches (j'ai notamment testé un ALTER TABLE mais si j'ai bien compris, cela fonctionne au sein d'une même base).
Je ne cherche pas forcément à automatiser le process, le nombre de tables à transférer étant relativement restreint (une grosse 20aine de tables).
Merci par avance de l'aide que vous pourrez m'apporter.
Cordialement,
Hors ligne
Je pense que le mieux que vous avez à faire, c'est utiliser pg_dump table par table, et en 3 phases pour chaque table:
pg_dump -t ma_table --section=pre_data
vous génèrera l'ordre SQL pour créer la table elle-même, vous n'aurez qu'à corriger pour la créer dans le bon schéma
pg_dump -t ma_table --section=data
vous génèrera le copy pour les données. Là il faudra modifier la première ligne pour corriger le COPY. Ça pourrait générer de gros fichiers, donc vous avez une autre option peut-être plus sympa, qui ne vous oblige même pas à passer par un fichier:
psql marc -c 'COPY demo_data TO STDOUT' | psql target -c 'COPY target_schema.demo_data FROM STDIN'
Ici, je copie la table «public.demo_data» de la base marc vers la table «target_schema.demo_data» de la base target. Vous pouvez bien sûr rajouter des options dans psql pour se connecter à une machine distante, à un autre utilisateur, remplacer le | par une commande ssh si la machine cible n'est joignable que par ssh, etc…
Une fois les données importées (le mieux serait de faire l'import des données de toutes les tables, pour avoir moins d'ennuis), vous pouvez, pour chaque table, restaurer les index et contraintes d'intégrité:
pg_dump -t ma_table --section=post-data
. Là aussi il faudra éditer ces scripts avant de les rejouer sur la base cible (pour corriger les schémas…), et probablement les jouer dans le bon ordre (les contraintes d'unicité et les index avant les foreign key, sinon vous ne pourrez pas restaurer les foreign key)
Marc.
Hors ligne
Bonjour Marc,
Et merci pour ces réponses.
Je vais tenter de réaliser votre procédure.
Cordialement.
Hors ligne
Bonjour,
La création de tables est ok.
Mais je ne parviens pas à réaliser la copie des données sans passer par un fichier.
Dans la fenêtre psql, lancée depuis PgAdmin sur la base de destination, j'ai saisi :
psql -h NomduServer - p NumeroduPort -U login NomdemaBasedeDepart -c 'COPY public.MaTable TO STDOUT' | psql NomdemaBasedeDestination -c 'COPY MonNouveauSchema.MaTable FROM STDIN'
je n'ai aucun retour, je reviens sur le nom de ma base de destination, en attente d'une nouvelle commande.
Si je lance la commande depuis une fenêtre Dos ouverte depuis le répertoire windows de PgAdmin contenant le programme psql.exe; j'ai les erreurs suivantes :
psql: warning: extra command-line argument "COPY" ignored
psql: warning: extra command-line argument " MonSchema.MaTable" ignored
psql: warning: extra command-line argument "FROM" ignored
psql: warning: extra command-line argument "STDIN" ignored
psql: warning: extra command-line argument "NomduServeur" ignored
psql: warning: extra command-line argument "-p" ignored
psql: warning: extra command-line argument "NumeroduPort " ignored
psql: warning: extra command-line argument "-U" ignored
psql: warning: extra command-line argument "login" ignored
psql: warning: extra command-line argument "-c" ignored
psql: warning: extra command-line argument "public.MaTable" ignored
psql: warning: extra command-line argument "TO" ignored
psql: warning: extra command-line argument "STDOUT" ignored
psql: could not connect to server: Connection refused
Is the server running on host "localhost" and accepting TCP/IP connections on port 5432 ?
Faut-il passer différemment les paramètres de connexion au serveur (nom, port, login/pwd) ou ailleurs dans la ligne de commande ?
Je ne sais pas ce que je ne fais pas correctement...
Merci de vos réponses.
Hors ligne
Ok, j'étais parti de l'hypothèse que vous étiez sous Unix. Sous windows, les pipes ne marchent pas bien du tout, évitez les...
Je n'ai aucune idée de comment faire cette tuyauterie sous Windows, désolé.
Marc.
Hors ligne
Pas grave, j'aurais dû préciser.
Je vais continuer de chercher, mais si quelqu'un a une idée, qu'il n'hésite pas ;-)
Merci.
Hors ligne
J'ai réussi à écrire la bonne commande pour intégrer les données dans les tables créées :
psql –h NomServeur –p NumeroPort -d NomdelaBase –U utilisateur –f chemind'accèsàmonfichier.sql
Hors ligne
Pages : 1