Nie ma takiego widoku po wyjęciu z pudełka, ale dane potrzebne do jego utworzenia znajdują się w katalogach systemowych:
http://www.postgresql.org/docs/current/static/catalogs.html
Na przykład istnieje relacl
pole w pg_class
:
select oid::regclass, relacl from pg_class;
Podobne pola znajdują się w innych katalogach, a mianowicie typacl
w pg_type
i proacl
w pg_proc
.
Prawdopodobnie będziesz chciał użyć jeszcze dwóch katalogów, a mianowicie pg_authid
aby wiedzieć, które role mają uprawnienia superużytkownika i pg_auth_members
wiedzieć, kto pełni jaką rolę.
(pg_default_acl
jest używany tylko podczas tworzenia obiektów, więc nie jest przydatny).
Istnieje kilka wewnętrznych funkcji związanych z aklitem, które mogą się przydać podczas tworzenia widoku. Możesz je wymienić w psql
jak tak:
\df+ *acl*
W szczególności aclexplode()
. Miejmy nadzieję, że na początek wystarczy poniższy przykład:
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;
Można go zoptymalizować, rozwijając najpierw wiersze acl, np.:
select oid::regclass,
aclitem.grantee
from (select oid, aclexplode(relacl) as aclitem from pg_class) sub
Zaprowadzi Cię prosto do pożądanego rezultatu.
O ile mi wiadomo, jest to tak dobre, jak można uzyskać za pomocą wbudowanych narzędzi. (Oczywiście możesz napisać własny zestaw operatorów w języku C, jeśli chcesz spróbować dalej optymalizować.)
Jeśli chodzi o twoje dodatkowe pytania, obawiam się, że może na nie odpowiedzieć tylko garstka ludzi na świecie, czyli sami główni twórcy. Częściej przebywają na liście hakerów pg niż tutaj.