PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Recupero di tutti i privilegi degli oggetti per un ruolo specifico

Non esiste una tale visualizzazione pronta all'uso, ma i dati necessari per crearla sono nei cataloghi di sistema:

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

Ad esempio, c'è un relacl campo in pg_class :

select oid::regclass, relacl from pg_class;

Ci sono campi simili in altri cataloghi, vale a dire typacl in pg_type e proacl in pg_proc .

Presumibilmente vorrai usare altri due cataloghi, vale a dire pg_authid per sapere quali ruoli hanno privilegi di superutente e pg_auth_members per sapere chi ha quale ruolo.

(Il pg_default_acl viene utilizzato solo durante la creazione dell'oggetto, quindi non è utile.)

Ci sono un paio di funzioni interne relative all'clitem che possono tornare utili per creare la vista. Puoi elencarli in psql così:

\df+ *acl*

In particolare aclexplode() . Si spera che il seguente esempio sia sufficiente per iniziare:

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;

Può essere ottimizzato espandendo prima le righe acl, ad esempio:

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

Ti porterà direttamente al risultato desiderato.

Per quanto ne so, è quanto di meglio si otterrà usando gli strumenti integrati. (Naturalmente, potresti scrivere il tuo set di operatori in C se desideri provare a ottimizzarlo ulteriormente.)

Per quanto riguarda le tue domande extra, temo che possano trovare risposta solo da una manciata di persone nel mondo, alias gli stessi sviluppatori principali. Frequentano l'elenco degli hacker di pg più spesso di quanto non facciano qui.