PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Abrufen aller Objektberechtigungen für eine bestimmte Rolle

Es gibt keine solche Ansicht, aber die Daten, die zu ihrer Erstellung benötigt werden, befinden sich in den Systemkatalogen:

http://www.postgresql.org/docs/current/static/catalogs.html

Zum Beispiel gibt es einen relacl Feld in pg_class :

select oid::regclass, relacl from pg_class;

Es gibt ähnliche Felder in anderen Katalogen, nämlich typacl in pg_type und proacl in pg_proc .

Vermutlich möchten Sie zwei weitere Kataloge verwenden, nämlich pg_authid um zu wissen, welche Rollen Superuser-Privilegien haben, und pg_auth_members um zu wissen, wer welche Rolle hat.

(Die pg_default_acl wird nur während der Objekterstellung verwendet, ist also nicht sinnvoll.)

Es gibt ein paar interne Funktionen im Zusammenhang mit Aclitem, die sich beim Erstellen der Ansicht als nützlich erweisen können. Sie können sie in psql auflisten so:

\df+ *acl*

Insbesondere aclexplode() . Das folgende Beispiel reicht hoffentlich aus, um Ihnen den Einstieg zu erleichtern:

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;

Es kann optimiert werden, indem zuerst die acl-Zeilen erweitert werden, z. B.:

select oid::regclass,
       aclitem.grantee
from (select oid, aclexplode(relacl) as aclitem from pg_class) sub

Sie führt Sie direkt zum gewünschten Ergebnis.

Soweit mir bekannt ist, ist das mit den integrierten Tools so gut wie möglich. (Natürlich könnten Sie Ihren eigenen Satz von Operatoren in C schreiben, wenn Sie versuchen möchten, dies weiter zu optimieren.)

In Bezug auf Ihre zusätzlichen Fragen, fürchte ich, dass sie nur von einer Handvoll Menschen auf der Welt beantwortet werden können, auch bekannt als die Core-Entwickler selbst. Sie hängen öfter auf der Pg-Hackerliste rum als hier.