A coluna
relacl do catálogo do sistema pg_class contém todas as informações sobre privilégios. Dados de exemplo no esquema
public propriedade de postgres com concessões para 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;
Consultando o
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)
Comentários:
coalesce(relacl::text[], format('{%s=arwdDxt/%s}', rolname, rolname))- Nulo emrelaclsignifica que o proprietário tem todos os privilégios;unnest(...) acl-relaclé uma matriz deaclitem, um elemento de array para um usuário;regexp_split_to_array(acl, '=|/') s- dividiraclitemem:s[1] nome de usuário, s[2] privilégios;coalesce(nullif(s[1], ''), 'public') as grantee- nome de usuário vazio significapublic.
Modifique a consulta para selecionar um usuário individual ou tipo específico de relação ou outros esquemas, etc...
Leia na documentação:
- O catálogo
pg_class, GRANTcom a descrição do sistema acl.
De maneira semelhante, você pode obter informações sobre privilégios concedidos em esquemas (a coluna
nspacl em pg_namespace
) e bancos de dados (datacl em pg_database
)