PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment puis-je consulter toutes les autorisations de base de données et d'objets pour un rôle ?

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 dans relacl signifie que le propriétaire a tous les privilèges ;
  • unnest(...) acl - relacl est un tableau de aclitem , un élément de tableau pour un utilisateur ;
  • regexp_split_to_array(acl, '=|/') s - diviser aclitem dans :s[1] nom d'utilisateur, s[2] privilèges ;
  • coalesce(nullif(s[1], ''), 'public') as grantee - nom d'utilisateur vide signifie public .

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 :

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 )