39 votes

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

J'ai une application django 1.4 avec une base de données postgres 9.1 alimentée sur un serveur de développement local. 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, donc j'ai utilisé :

pg_dump -f dump.sql -Ox database

et ensuite restauré sur le serveur avec :

psql -1 -f dump.sql database

Maintenant, en essayant de se connecter en ligne à l'administration du site, on obtient une exception "permission denied for relation django_session". J'ai essayé de vider les données avec/sans le commutateur -Ox et toutes ses combinaisons mais sans succès. Je suis également en train de supprimer la base de données et de la recréer à partir de zéro sur le serveur avec le propriétaire correct tel que défini dans settings.py.

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

Est-ce que je rate quelque chose ici ?

105voto

user698585 Points 3019

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 super-utilisateur. Il ne suffit pas de définir le propriétaire au moment de la création de la base de données. La solution finale pour la migration est la suivante :

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

et ensuite 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.

2voto

Daniil Points 2384

Essayez de le faire à partir de postgres utilisateur :

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

Ou juste passer -U drapeau :

pg_dump -f dump.sql -Ox database -U postgres

0voto

Rexford Points 3131

Voici comment j'ai réparé le mien. Je me suis épargné une tonne de maux de tête en changeant simplement l'utilisateur pour qu'il corresponde à l'utilisateur actuellement connecté sur le serveur de destination où l'importation aura lieu.

Dans mon cas, la base de données importée avait un utilisateur x (x était également le nom d'utilisateur de la machine sur laquelle elle était exécutée), et la machine de destination avait un nom d'utilisateur y, et un utilisateur postgres y également.

Par conséquent, j'ai simplement modifié l'utilisateur et le mot de passe de la base de données dans mes paramètres Django pour qu'ils correspondent aux détails de l'utilisateur de la machine de destination.

Puis j'ai fait ça :

$ sudo -u postgres psql psql > GRANT ALL PRIVILEGES DATABASE ON mydb TO y;

Je sirote le kool-aid maintenant !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X