我发现一种更好的方法(我似乎记得这是从内置于psql中的一些查询或信息模式视图中获取的),就是使用
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')
进行测试。