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