Vous n'êtes pas identifié(e).

#1 09/02/2018 14:34:49

chanteclair
Membre

Transfert de table

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

#2 09/02/2018 16:24:32

Marc Cousin
Membre

Re : Transfert de table

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

#3 12/02/2018 10:59:53

chanteclair
Membre

Re : Transfert de table

Bonjour Marc,
Et merci pour ces réponses.
Je vais tenter de réaliser votre procédure.
Cordialement.

Hors ligne

#4 13/02/2018 16:20:37

chanteclair
Membre

Re : Transfert de table

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

#5 13/02/2018 17:19:38

Marc Cousin
Membre

Re : Transfert de table

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

#6 13/02/2018 17:31:11

chanteclair
Membre

Re : Transfert de table

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

#7 15/02/2018 18:15:04

chanteclair
Membre

Re : Transfert de table

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

Pied de page des forums