web-dev-qa-db-fra.com

ERREUR: autorisation refusée pour la relation nom_table sur Postgres lors de la tentative d'utilisation d'une commande 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 tableaux, mais lorsqu'il tente d'effectuer une simple sélection, il obtient:

ERROR: permission denied for relation mytable
SQL state: 42501

Cela se passe sur PostgreSQL 9.1

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

81
sorin

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

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 ALL 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-rread-only-user-in-postgres/ pour plusieurs aspects importants

Si quelqu'un trouve un code plus court, et de préférence un code capable de le faire pour toutes les bases de données existantes, des félicitations supplémentaires.

147
sorin

Essayez d'ajouter

GRANT USAGE ON SCHEMA public to readonly;

Vous ne saviez probablement pas qu'il est nécessaire d'avoir les autorisations requises sur un schéma pour pouvoir utiliser des objets dans le schéma.

12
sufleR