background success stories

Postgresql : créer un utilisateur en lecture seule sur une base

Contexte

Sous Postgresql, il n’existe pas, dans les versions actuelles, de privilège spécifique permettant de donner l’accès en lecture à un utilisateur, sur l’ensemble des objets d’une base de données (schémas, tables, vues, séquences…).

Il faut donc procéder en plusieurs étapes.

Ci-dessous sont décrites les différentes étapes pour autoriser l’utilisateur « mon_user_read_only » en lecture pour toutes les tables, vues et séquences du schéma « mon_schema » de la base « ma_base ».

Il faut être connecté à la base en question.

 

Solution

Connecté en tant que user postgres, autoriser le user sur le schéma.

ma_base=# GRANT USAGE ON SCHEMA mon_schema TO mon_user_read_only ;

 

Connecté en tant que user postgres, autoriser le user en lecture sur toutes les tables, vues et séquences existantes du schéma :

ma_base=# GRANT SELECT ON ALL TABLES IN SCHEMA mon_schema TO mon_user_read_only ;
ma_base=# GRANT SELECT ON ALL SEQUENCES IN SCHEMA mon_schema TO mon_user_read_only ;

 

Connecté en tant que user postgres, autoriser le user en lecture sur toutes les futures tables, vues et séquences qui seront créées dans le schéma par le user postgres :

ma_base=# ALTER DEFAULT PRIVILEGES IN SCHEMA mon_schema GRANT SELECT ON TABLES TO mon_user_read_only ;
ma_base=# ALTER DEFAULT PRIVILEGES IN SCHEMA mon_schema GRANT SELECT ON SEQUENCES TO mon_user_read_only ;

 

Attention : si des tables, vues ou séquences dans ce schéma peuvent potentiellement être créées par un autre user (exemple : le owner des objets du schéma), il faut également rejouer les mêmes commandes que précédemment, mais en étant connecté avec le user qui est owner, et non pas le user « postgres ». Sinon, le user en read only n’aurait pas le droit de lecture sur les objets créés par le owner :

ma_base=# ALTER DEFAULT PRIVILEGES IN SCHEMA mon_schema GRANT SELECT ON TABLES TO mon_user_read_only ;
ma_base=# ALTER DEFAULT PRIVILEGES IN SCHEMA mon_schema GRANT SELECT ON SEQUENCES TO mon_user_read_only ;

 

Toutes ces opérations sont à répéter pour chaque schéma de la base de données sur laquelle on souhaite donner le droit de lecture sur les objets.