Saya telah menemukan bahwa pendekatan yang lebih baik (dan sepertinya saya ingat ini diambil dari beberapa kueri yang dibangun ke dalam psql, atau mungkin tampilan information_schema) adalah dengan menggunakan has_*_privilege
fungsi, dan hanya menerapkannya ke satu set semua kemungkinan kombinasi pengguna dan objek. Ini akan memperhitungkan memiliki akses ke objek melalui beberapa peran grup juga.
Misalnya, ini akan menunjukkan pengguna mana yang memiliki akses ke tabel dan tampilan non-katalog:
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;
Hak istimewa yang mungkin dirinci dalam deskripsi has_*_privilege
berfungsi di http://www .postgresql.org/docs/current/static/functions-info.html#FUNCTIONS-INFO-ACCESS-TABLE
.
'CREATE TEMP' adalah hak istimewa tingkat basis data:memungkinkan pengguna untuk menggunakan pg_temp_*
skema. Itu dapat diuji dengan has_database_privilege(useroid, datoid, 'TEMP')
.