Ik heb ontdekt dat een betere benadering (en ik meen me te herinneren dat dit is overgenomen van enkele query's die in psql zijn ingebouwd, of misschien de information_schema-weergaven) is om de has_*_privilege
te gebruiken functies en pas ze eenvoudig toe op een set van alle mogelijke combinaties van gebruiker en object. Dit houdt ook rekening met toegang tot een object via een groepsrol.
Dit laat bijvoorbeeld zien welke gebruikers welke toegang hebben tot niet-catalogustabellen en weergaven:
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;
De mogelijke privileges worden gedetailleerd beschreven in de beschrijving van de has_*_privilege
functies op http://www .postgresql.org/docs/current/static/functions-info.html#FUNCTIONS-INFO-ACCESS-TABLE
.
'CREATE TEMP' is een privilege op databaseniveau:het staat een gebruiker toe om een pg_temp_*
te gebruiken schema. Het kan worden getest met has_database_privilege(useroid, datoid, 'TEMP')
.