web-dev-qa-db-fra.com

Importer une base de données postgres sans rôles

J'ai une base de données qui a été exportée avec pg_dump, mais maintenant, quand j'essaie de l'importer à nouveau avec:

psql -d databasename < mydump.sql

Il échoue à essayer d'accorder des rôles à des personnes qui n'existent pas. (l'erreur indique que le "rôle" xxx "n'existe pas")

Existe-t-il un moyen d'importer et de définir automatiquement tous les rôles pour mon utilisateur?

37
Braden

Le comportement par défaut de l'importation est qu'il remplace tous les rôles qu'il ne connaît pas par le rôle avec lequel vous effectuez l'importation. Donc, selon ce pour quoi vous avez besoin de la base de données, vous pourriez bien être en train de l'importer et d'ignorer les messages d'erreur.

Citant de http://www.postgresql.org/docs/9.2/static/backup-dump.html#BACKUP-DUMP-RESTORE

Avant de restaurer un vidage SQL, tous les utilisateurs qui possèdent des objets ou ont reçu des autorisations sur les objets de la base de données vidée doivent déjà exister. Si ce n'est pas le cas, la restauration échouera à recréer les objets avec la propriété et/ou les autorisations d'origine. (Parfois, c'est ce que vous voulez, mais ce n'est généralement pas le cas.)

35
oerich

La réponse que vous cherchez peut-être est d'ajouter le --no-owner à la pg_restore commande. Contrairement à la réponse acceptée pour le moment, la commande doit créer chaque objet avec l'utilisateur actuel même si le rôle dans le vidage n'existe pas dans la base de données.

Donc, aucun élément ne sera ignoré par pg_restore mais si certains éléments importés appartiennent à différents utilisateurs, tous les enregistrements seront désormais détenus par un seul utilisateur pour autant que je sache.

26

Avec pg_restore vous pouvez utiliser le --role=rolename option pour forcer l'utilisation d'un nom de rôle pour effectuer la restauration. Mais le vidage doit être au format texte non ordinaire.
Par exemple, vous pouvez effectuer un vidage avec:

pg_dump -F c -Z 9 -f my_file.backup my_database_name

et que vous pouvez le restaurer avec:

pg_restore -d my_database_name --role=my_role_name my_file.backup

pour plus d'informations: http://www.postgresql.org/docs/9.2/static/app-pgrestore.html

17
AndreaBoc

Oui, vous pouvez vider tous les objets "globaux" de votre base de données source avec l'option -g de pg_dumpall:

pg_dumpall -g  > globals.sql

Exécutez ensuite globals.sql sur votre base de données cible avant d'importer.

9
Brian.D.Myers