Vérifier les droits d’un utilisateur sur une table PostgreSQL

Le par Anthony Domps.

Lorsqu’on se demande si un utilisateur peut lire ou écrire une table précise, PostgreSQL fournit une fonction native fiable : has_table_privilege

has_table_privilege(user, table, privilege)

Elle retourne true ou false selon que l’utilisateur possède ou non le privilège demandé sur la table. Elle prend en compte les droits directs, les héritages de rôles et les permissions effectives.

Privilèges possibles

Le troisième argument correspond aux privilèges qu’on peut accorder via GRANT ... ON TABLE.

Il est possible de passer plusieurs privilèges séparés par des virgules. La fonction retournera true uniquement si tous sont présents.

Exemple

SELECT
has_table_privilege('mon_user', 'public.ma_table', 'SELECT') AS can_read,
has_table_privilege('mon_user', 'public.ma_table', 'INSERT') AS can_insert,
has_table_privilege('mon_user', 'public.ma_table', 'UPDATE') AS can_update,
has_table_privilege('mon_user', 'public.ma_table', 'DELETE') AS can_delete;

Pour un test combiné :

SELECT has_table_privilege(
'mon_user',
'public.ma_table',
'SELECT, INSERT, UPDATE'
);

Astuce : toujours préciser le schéma (schema.table) pour éviter les surprises liées au search_path.

Conclusion

Pour savoir si un utilisateur peut lire ou écrire une table, inutile d’explorer les catalogues système à la main : has_table_privilege donne la réponse officielle, propre et complète.