PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Récupération de tous les privilèges d'objet pour un rôle spécifique

Il n'y a pas une telle vue prête à l'emploi, mais les données nécessaires pour la créer se trouvent dans les catalogues système :

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

Par exemple, il y a un relacl champ dans pg_class :

select oid::regclass, relacl from pg_class;

Il existe des champs similaires dans d'autres catalogues, à savoir typacl dans pg_type et proacl dans pg_proc .

Vous voudrez probablement utiliser deux autres catalogues, à savoir pg_authid pour savoir quels rôles ont des privilèges de superutilisateur, et pg_auth_members pour savoir qui a quel rôle.

(Le pg_default_acl n'est utilisé que lors de la création d'un objet, il n'est donc pas utile.)

Il existe quelques fonctions internes liées à aclitem qui peuvent être utiles pour créer la vue. Vous pouvez les lister en psql comme ça :

\df+ *acl*

En particulier aclexplode() . L'exemple suivant suffira, espérons-le, pour vous aider à démarrer :

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;

Il peut être optimisé en développant d'abord les lignes acl, par exemple :

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

Cela vous mènera directement au résultat souhaité.

Autant que je sache, c'est à peu près aussi bon qu'il obtiendra en utilisant les outils intégrés. (Naturellement, vous pouvez écrire votre propre ensemble d'opérateurs en C si vous souhaitez essayer d'optimiser cela davantage.)

En ce qui concerne vos questions supplémentaires, je crains qu'elles ne puissent être répondues que par une poignée de personnes dans le monde, c'est-à-dire les développeurs de base eux-mêmes. Ils traînent plus souvent sur la liste des hackers pg qu'ici.