Vérifier les droits d’un utilisateur sur une table PostgreSQL
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.
- SELECT : lecture des données
- INSERT : insertion de lignes
- UPDATE : modification de lignes
- DELETE : suppression de lignes
- TRUNCATE : vidage complet de la table
- REFERENCES : création de clés étrangères vers cette table
- TRIGGER : création de triggers sur la 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.