La colonne relacl du catalogue système pg_class contient toutes les informations sur les privilèges.
Exemple de données dans le schéma public propriété de postgres avec des subventions pour newuser :
create table test(id int);
create view test_view as select * from test;
grant select, insert, update on test to newuser;
grant select on test_view to newuser;
Interrogation de la pg_class :
select
relname,
relkind,
coalesce(nullif(s[1], ''), 'public') as grantee,
s[2] as privileges
from
pg_class c
join pg_namespace n on n.oid = relnamespace
join pg_roles r on r.oid = relowner,
unnest(coalesce(relacl::text[], format('{%s=arwdDxt/%s}', rolname, rolname)::text[])) acl,
regexp_split_to_array(acl, '=|/') s
where nspname = 'public'
and relname like 'test%';
relname | relkind | grantee | privileges
-----------+---------+----------+------------
test | r | postgres | arwdDxt <- owner postgres has all privileges on the table
test | r | newuser | arw <- newuser has append/read/write privileges
test_view | v | postgres | arwdDxt <- owner postgres has all privileges on the view
test_view | v | newuser | r <- newuser has read privilege
(4 rows)
Commentaires :
coalesce(relacl::text[], format('{%s=arwdDxt/%s}', rolname, rolname))- Null dansrelaclsignifie que le propriétaire a tous les privilèges ;unnest(...) acl-relaclest un tableau deaclitem, un élément de tableau pour un utilisateur ;regexp_split_to_array(acl, '=|/') s- diviseraclitemdans :s[1] nom d'utilisateur, s[2] privilèges ;coalesce(nullif(s[1], ''), 'public') as grantee- nom d'utilisateur vide signifiepublic.
Modifiez la requête pour sélectionner un utilisateur individuel ou un type de relation spécifique ou un autre schéma, etc...
Lire dans la documentation :
- Le catalogue
pg_class, GRANTavec la description du système ACL.
De la même manière, vous pouvez obtenir des informations sur les privilèges accordés sur les schémas (la colonne nspacl dans pg_namespace
) et bases de données (datacl dans pg_database
)