Jag har funnit att ett bättre tillvägagångssätt (och jag verkar komma ihåg att detta togs från vissa frågor inbyggda i psql, eller kanske informationsschemavyerna) är att använda has_*_privilege
funktioner och helt enkelt tillämpa dem på en uppsättning av alla möjliga kombinationer av användare och objekt. Detta kommer att ta hänsyn till att ha tillgång till ett objekt via någon grupproll också.
Till exempel kommer detta att visa vilka användare som har vilken åtkomst till icke-katalogtabeller och vyer:
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 möjliga privilegierna beskrivs i beskrivningen av has_*_privilege
funktioner på http://www .postgresql.org/docs/current/static/functions-info.html#FUNCTIONS-INFO-ACCESS-TABLE
.
'CREATE TEMP' är ett privilegium på databasnivå:det tillåter en användare att använda en pg_temp_*
schema. Det kan testas med has_database_privilege(useroid, datoid, 'TEMP')
.