web-dev-qa-db-fra.com

Autorisation refusée à Postgres

J'ai ajouté l'utilisateur myuserà Postgres.

J'ai ensuite ajouté la base de données mydatabase dans l'interface graphique de pgAdmin III et restauré à partir d'un fichier de sauvegarde. Le propriétaire de mydatabase est donc le superutilisateur postgres.

Ensuite, j'ai essayé de donner tous les droits d'accès et de modifier mydatabase en myuser. Je me suis connecté à psql en tant qu'utilisateur postgres:

psql -d template1 -U postgres  

puis j'ai exécuté cette requête:

GRANT ALL PRIVILEGES ON DATABASE mydatabase TO myuser

Maintenant, je peux utiliser myuser pour me connecter, mais si j'essaie une simple requête, j'obtiens cette erreur:

ERROR:  permission denied for relation table_name

Suis-je en train de manquer quelque chose? Pouvez-vous m'aider à résoudre ce problème?

30
Aslan986

Vous avez accordé les privilèges CREATE, CONNECT et TEMPORARY sur la base de données à myuser mais vous n'avez pas encore accordé les privilèges de table SELECT et INSERT. Vous aurez besoin de quelque chose comme:

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO myuser;

En outre, vous avez besoin de privilèges sur les séquences si vous avez des colonnes série ou d'autres valeurs par défaut des colonnes tirées des séquences. Généralement, le privilège USAGE est suffisant pour que les opérations INSERT fonctionnent, mais puisque vous avez demandé à "give all rights":

GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO myuser;

Détails sur GRANT dans le manuel.

35
Gord Thompson

Utilisez la commande fournie par @Gord pour objets déjà existants.

Vous voudrez probablement accorder DEFAULT PRIVILEGES aussi. Ainsi, votre utilisateur myuser peut également accéder automatiquement aux futurs objets.

Peut être fait selon schéma:

ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO myuser;

Si vous omettez le schéma, il s'applique à l'ensemble de la base de données:

ALTER DEFAULT PRIVILEGES GRANT ALL ON TABLES TO myuser;

S'applique uniquement aux objets créés par le rôle spécifié (par défaut au rôle qui exécute cette commande):

ALTER DEFAULT PRIVILEGES FOR ROLE administrator GRANT IN SCHEMA public ... ;

Disponible depuis PostgreSQL 9.0.
N'oubliez pas de GRANT privilèges sur SEQUENCES en plus si vous en avez. (Par exemple, comme source des valeurs par défaut dans une colonne série.)

11
Erwin Brandstetter

Bien que les autres réponses à cette question soient correctes, permettez-moi de proposer une autre option. Lorsqu'une base de données est restaurée, vous pouvez contrôler l'utilisateur sous lequel la base de données est restaurée. Je ne suis pas sûr des détails de la façon de procéder avec pgAdmin3, mais les utilitaires pg_dump et pg_restore incluent des options spécifiques pour permettre que cela soit fait.

Si tu utilises pg_dump --no-owner alors le fichier de vidage ne comprendra aucune restauration de propriété. Lorsque vous restaurez un vidage créé à l'aide de --no-owner, l'utilisateur que vous avez utilisé pour effectuer la restauration sera propriétaire de tous les objets. Si vous disposez d'un fichier de vidage au format personnalisé et que vous utilisez pg_restore, vous pouvez utiliser le --no-owner option avec pg_restore pour qu'il ignore toute restauration de propriété lors de la restauration de la base de données.

Notez que cela nécessitera que l'utilisateur effectuant la restauration dispose des droits nécessaires sur la base de données pour créer les objets qui existent dans le fichier de vidage. De manière générale, l'octroi de "CREATE" au niveau de la base de données à l'utilisateur effectuant la restauration sera suffisant.

2
Stephen Frost