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

Henter alle objektprivilegier for specifik rolle

Der er ikke en sådan visning ud af boksen, men de nødvendige data for at oprette den er i systemkatalogerne:

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

For eksempel er der en relacl felt i pg_class :

select oid::regclass, relacl from pg_class;

Der er lignende felter i andre kataloger, nemlig typacl i pg_type og proacl i pg_proc .

Du vil formentlig bruge to kataloger mere, nemlig pg_authid at vide, hvilke roller der er, har superbrugerrettigheder og pg_auth_members at vide, hvem der har hvilken rolle.

(pg_default_acl bruges kun under oprettelse af objekter, så det er ikke nyttigt.)

Der er et par aclitem-relaterede interne funktioner, der kan være nyttige til at skabe udsigten. Du kan liste dem i psql sådan:

\df+ *acl*

Især aclexplode() . Følgende eksempel vil forhåbentlig være nok til at komme i gang:

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;

Det kan optimeres ved at udvide acl-rækkerne først, f.eks.:

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

Det vil føre dig direkte til det ønskede resultat.

Så vidt jeg ved, er det omtrent lige så godt, som det bliver ved at bruge de indbyggede værktøjer. (Du kan naturligvis skrive dit eget sæt af operatorer i C, hvis du vil prøve at optimere dette yderligere.)

Med hensyn til dine ekstra spørgsmål er jeg bange for, at de kun kan besvares af en håndfuld mennesker i verden, også kendt som kerneudviklerne selv. De hænger ud på pg-hackerlisten oftere, end de gør her.



  1. Udskiftning af SQL-markører med alternativer for at undgå præstationsproblemer

  2. Brug af StringWriter til XML-serialisering

  3. SQL række returordre

  4. Masseopdatering i C#