Een dergelijke weergave is standaard niet beschikbaar, maar de gegevens die nodig zijn om deze te maken, staan in de systeemcatalogi:
http://www.postgresql.org/docs/current/static/catalogs.html
Er is bijvoorbeeld een relacl
veld in pg_class
:
select oid::regclass, relacl from pg_class;
Er zijn vergelijkbare velden in andere catalogi, namelijk typacl
in pg_type
en proacl
in pg_proc
.
U wilt waarschijnlijk nog twee catalogi gebruiken, namelijk pg_authid
om te weten welke rollen superuser-privileges hebben, en pg_auth_members
om te weten wie welke rol heeft.
(De pg_default_acl
wordt alleen gebruikt tijdens het maken van objecten, dus is niet nuttig.)
Er zijn een aantal acliitem-gerelateerde interne functies die van pas kunnen komen bij het maken van de weergave. Je kunt ze opsommen in psql
zoals zo:
\df+ *acl*
In het bijzonder aclexplode()
. Het volgende voorbeeld is hopelijk voldoende om u op weg te helpen:
select oid::regclass,
(aclexplode(relacl)).grantor,
(aclexplode(relacl)).grantee,
(aclexplode(relacl)).privilege_type,
(aclexplode(relacl)).is_grantable
from pg_class
where relacl is not null;
Het kan worden geoptimaliseerd door eerst de acl-rijen uit te breiden, bijvoorbeeld:
select oid::regclass,
aclitem.grantee
from (select oid, aclexplode(relacl) as aclitem from pg_class) sub
Het leidt je direct naar het gewenste resultaat.
Voor zover ik weet, is dat ongeveer net zo goed als het wordt met de ingebouwde tools. (Natuurlijk kunt u uw eigen set operators in C schrijven als u dit verder wilt optimaliseren.)
Wat betreft je extra vragen, ik ben bang dat ze alleen kunnen worden beantwoord door een handvol mensen in de wereld, oftewel de kernontwikkelaars zelf. Ze hangen vaker op de pg-hackerslijst dan hier.