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?
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;
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.)
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.