PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Извличане на всички привилегии на обект за конкретна роля

Няма такъв изглед извън кутията, но данните, необходими за създаването му, са в системните каталози:

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

Например, има relacl поле в pg_class :

select oid::regclass, relacl from pg_class;

Подобни полета има и в други каталози, а именно typacl в pg_type и proacl в pg_proc .

Вероятно ще искате да използвате още два каталога, а именно pg_authid за да знаете кои роли имат привилегии на суперпотребител и pg_auth_members да знам кой каква роля има.

(pg_default_acl се използва само по време на създаване на обект, така че не е полезен.)

Има няколко вътрешни функции, свързани с aclitem, които могат да бъдат полезни при създаването на изгледа. Можете да ги изброите в psql така:

\df+ *acl*

По-специално aclexplode() . Надяваме се, че следният пример ще бъде достатъчен, за да започнете:

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;

Може да се оптимизира, като първо се разширят редовете на acl, напр.:

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

Това ще ви отведе направо до желания резултат.

Доколкото ми е известно, това е толкова добре, колкото ще се получи с помощта на вградените инструменти. (Естествено, можете да напишете свой собствен набор от оператори в C, ако искате да опитате да оптимизирате това допълнително.)

По отношение на вашите допълнителни въпроси, страхувам се, че могат да отговорят само от шепа хора по света, известни още като самите основни разработчици. Те се мотаят в списъка с хакери на pg по-често, отколкото тук.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgres Left Join с условието къде

  2. Как да закръглим до най-близките X минути с PL/pgSQL?

  3. Връщане на множество полета като запис в PostgreSQL с PL/pgSQL

  4. Създаване на настройка за репликация на PostgreSQL в Debian/Ubuntu

  5. Вземете номера на седмицата от дата в PostgreSQL