Столбец relacl
системного каталога pg_class
содержит всю информацию о привилегиях.
Пример данных в схеме public
, принадлежащих postgres
с грантами 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;
Запрос 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)
Комментарии:
coalesce(relacl::text[], format('{%s=arwdDxt/%s}', rolname, rolname))
- Null в relacl
означает, что владелец имеет все привилегии;
unnest(...) acl
- relacl
представляет собой массив из aclitem
, один элемент массива для пользователя;
regexp_split_to_array(acl, '=|/') s
- разделить aclitem
на: s[1] имя пользователя, s[2] привилегии;
coalesce(nullif(s[1], ''), 'public') as grantee
- пустое имя пользователя означает public
.
Измените запрос, чтобы выбрать отдельного пользователя или определенный тип отношения или другие схемы и т. д.
Читайте в документации:
Аналогичным образом можно получить информацию о привилегиях, предоставленных схемам (столбец nspacl
в pg_namespace
) и базах данных (datacl
в pg_database
а>)
person
klin
schedule
02.10.2016