PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Pobieranie wszystkich uprawnień do obiektów dla określonej roli

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Utwórz tabelę dwóch typów w PostgreSQL

  2. Jak przyspieszyć działanie wstawiania w PostgreSQL

  3. Uruchamianie PostgreSQL tylko w pamięci

  4. Optymalizacja zapytań Postgres (wymuszenie skanowania indeksu)

  5. Jak odczytać wszystkie wiersze z ogromnego stołu?