Ответ 1
Я нашел, что лучший подход (и я, кажется, помню, что это было взято из некоторых запросов, встроенных в psql, или, может быть, из представлений information_schema), заключается в использовании функций has_*_privilege
и просто применять их к набору все возможные комбинации пользователя и объекта. Это будет учитывать наличие доступа к объекту через некоторую роль группы.
Например, это покажет, какие пользователи имеют доступ к некаталограммным таблицам и представлениям:
select usename, nspname || '.' || relname as relation,
case relkind when 'r' then 'TABLE' when 'v' then 'VIEW' end as relation_type,
priv
from pg_class join pg_namespace on pg_namespace.oid = pg_class.relnamespace,
pg_user,
(values('SELECT', 1),('INSERT', 2),('UPDATE', 3),('DELETE', 4)) privs(priv, privorder)
where relkind in ('r', 'v')
and has_table_privilege(pg_user.usesysid, pg_class.oid, priv)
and not (nspname ~ '^pg_' or nspname = 'information_schema')
order by 2, 1, 3, privorder;
Возможные привилегии подробно описаны в описании функций has_*_privilege
в http://www.postgresql.org/docs/current/static/functions-info.html#FUNCTIONS-INFO-ACCESS-TABLE.
"CREATE TEMP" - это привилегия на уровне базы данных: он позволяет пользователю использовать схему pg_temp_*
. Его можно проверить с помощью has_database_privilege(useroid, datoid, 'TEMP')
.