94 votes

ERREUR : permission refusée pour la relation tablename sur Postgres en essayant un SELECT en tant qu'utilisateur en lecture seule.

GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;

L'utilisateur en lecture seule peut se connecter, voir les tables, mais lorsqu'il essaie de faire une simple sélection, il obtient.. :

ERROR: permission denied for relation mytable
SQL state: 42501

Ce problème se produit sur PostgreSQL 9.1.

Qu'est-ce que j'ai fait de mal ?

1 votes

Pouvez-vous fournir quelques détails sur la "relation mytable" ? Schéma, est-ce une "vraie" table (ou une vue/fonction), triggers...

173voto

sorin Points 23747

Voici la solution complète pour PostgreSQL 9+, mise à jour récemment.

CREATE USER readonly  WITH ENCRYPTED PASSWORD 'readonly';
GRANT USAGE ON SCHEMA public to readonly;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO readonly;

-- repeat code below for each database:

GRANT CONNECT ON DATABASE foo to readonly;
\c foo
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO readonly; --- this grants privileges on new tables generated in new database "foo"
GRANT USAGE ON SCHEMA public to readonly; 
GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;

Merci à https://jamie.curle.io/creating-a-read-only-user-in-postgres/ pour plusieurs aspects importants

Si quelqu'un trouve un code plus court, et de préférence un code capable d'effectuer cette opération pour toutes les bases de données existantes, bravo.

6 votes

Cela inclut-il les vues ?

9 votes

Pourquoi donnez-vous le GRANT ALL par défaut à l'utilisateur en lecture seule ?

1 votes

J'ai donné exactement ce qui est défini, toujours la même erreur

15voto

sufleR Points 1249

Essayez d'ajouter

GRANT USAGE ON SCHEMA public to readonly;

Vous ne saviez probablement pas qu'il faut disposer des autorisations nécessaires pour un schéma, afin d'utiliser les objets de ce schéma.

0 votes

Quelque chose d'étrange se produit, je lance ces commandes sur le serveur en utilisant psql comme postgres et je reçois une réponse appropriée, GRANT . Pourtant, lorsque je regarde l'ACL sur les tables, je ne vois que deux autres comptes, dont l'un est le propriétaire de la base de données. jirauser et un autre compte en lecture seule nommé qauser . B readonly n'y apparaît pas. Postgres est en version 9.1 et j'ai même redémarré le serveur, mais rien ne se passe.

2 votes

Quel est/était le résultat de \du dans la console psql ? Pouvez-vous encore donner cette sortie ou est-ce déjà réparé comme dans votre réponse ?

0 votes

Je ne sais pas vraiment ce qui s'est passé, car la sortie était correcte (GRANT). Hier, cela n'a pas fonctionné, mais aujourd'hui, cela a fonctionné après avoir exécuté, à nouveau, les 3 commandes.

-2voto

Essayez ça :

ERROR : permission denied for relation etc. signifie que vous n'avez pas l'autorisation en tant qu'utilisateur, duh !

donc vérifier qui est l'utilisateur

  1. se connecter à la BD

    psql -d yourdb

  2. exécutez cette commande \L voir la liste des dbs et prefs et vous verrez quelque chose comme ceci

                                List of databases                                                                                                                                             

    Nom | Propriétaire | Encodage | Collationnement | Ctype | Privilèges d'accès
    -----------+--------+----------+-------------+-------------+----------------------
    action | action | UTF8 | en_US.UTF-8 | en_US.UTF-8 | en_US.UTF-8 | en_US.UTF-8

  3. Owner est le nom d'utilisateur que vous devez utiliser/changer, dans ce cas, il s'agit de 'action'.

J'espère que cela vous aidera !

-5voto

Dhwani Shah Points 11

Cela a marché pour moi :

Vérifiez le rôle actuel dans lequel vous êtes connecté en utilisant : SELECT CURRENT_USER, SESSION_USER ;

Note : Il doit correspondre au Propriétaire du schéma.

Schéma | Nom | Type Propriétaire
--------+--------+-------+----------

Si le propriétaire est différent, alors donnez toutes les subventions au rôle d'utilisateur actuel à partir du rôle d'administrateur par :

GRANT 'ROLE_OWNER' à 'CURRENT ROLENAME' ;

Ensuite, essayez d'exécuter la requête, elle donnera le résultat car elle a accès à toutes les relations maintenant.

-7voto

PuN1sh3r Points 91

Assurez-vous que votre utilisateur dispose d'attributs sur son rôle. par exemple :

postgres=# \du
                             List of roles
 Role name |                   Attributes                   | Member of 
-----------+------------------------------------------------+-----------
 flux      |                                                | {}
 postgres  | Superuser, Create role, Create DB, Replication | {}

après avoir exécuté la commande suivante :

postgres=# ALTER ROLE flux WITH Superuser;
ALTER ROLE
postgres=# \du
                             List of roles
 Role name |                   Attributes                   | Member of 
-----------+------------------------------------------------+-----------
 flux      | Superuser                                      | {}
postgres  | Superuser, Create role, Create DB, Replication | {}

ça a réglé le problème.

voir le tutoriel pour les rôles et autres ici : https://www.digitalocean.com/community/tutorials/how-to-use-roles-and-manage-grant-permissions-in-postgresql-on-a-vps--2

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