web-dev-qa-db-fra.com

Django: autorisation refusée lors de la tentative d'accès à la base de données après la restauration (migration)

J'ai une application Django 1.4 avec une base de données postgres 9.1 remplie localement sur le serveur de développement. Après un déploiement réussi, je voulais déplacer les données de la base de données locale vers la base de données en ligne, j'ai donc utilisé:

pg_dump -f dump.sql -Ox database

puis restauré sur le serveur avec:

psql -1 -f dump.sql database

Maintenant, essayer de se connecter en ligne à l'administrateur du site Web génère une exception "autorisation refusée pour la relation Django_session". J'ai essayé de vider les données avec/sans commutateur -Ox et toutes ses combinaisons mais sans succès. Je supprime également la base de données et la recrée à partir de zéro sur le serveur avec le bon propriétaire comme défini dans settings.py.

Si je lance un syndb normal sans restauration, tout fonctionne bien.

Est-ce que j'ai râté quelque chose?

36
Rabih Kodeih

Il s'avère que vous devez accorder la propriété explicite de tous les objets de la base de données au propriétaire après la restauration. Le propriétaire n'est pas un superutilisateur. Il ne suffit pas de définir uniquement le propriétaire au moment de la création de la base de données. La solution finale pour la migration se présente comme suit:

sur le client:

pg_dump -f dump.sql -Ox database

sur le serveur:

su postgres    
dropdb database
createdb database -O user
psql database -f dump.sql

puis pour définir les privilèges:

psql database -c "GRANT ALL ON ALL TABLES IN SCHEMA public to user;"
psql database -c "GRANT ALL ON ALL SEQUENCES IN SCHEMA public to user;"
psql database -c "GRANT ALL ON ALL FUNCTIONS IN SCHEMA public to user;"

Notez que nous aurions pu exécuter la commande sql dans la console psql mais ce formulaire est facilement intégrable dans les scripts et autres.

98
Rabih Kodeih

Essayez de le faire depuis postgres utilisateur:

Sudo su - postgres
pg_dump -f dump.sql -Ox database

Ou passez simplement -U drapeau:

pg_dump -f dump.sql -Ox database -U postgres
2
Daniil Ryzhkov