Jeg har fundet ud af, at en bedre tilgang (og jeg synes at huske, at dette blev taget fra nogle forespørgsler indbygget i psql, eller måske informationsskema-visningerne) er at bruge has_*_privilege
funktioner, og blot anvende dem på et sæt af alle mulige kombinationer af bruger og objekt. Dette vil også tage højde for at have adgang til et objekt via en grupperolle.
For eksempel vil dette vise, hvilke brugere der har hvilken adgang til ikke-katalogtabeller og visninger:
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 mulige privilegier er detaljeret i beskrivelsen af has_*_privilege
funktioner på http://www .postgresql.org/docs/current/static/functions-info.html#FUNCTIONS-INFO-ACCESS-TABLE
.
'CREATE TEMP' er et privilegium på databaseniveau:det tillader en bruger at bruge en pg_temp_*
skema. Det kan testes med has_database_privilege(useroid, datoid, 'TEMP')
.