sql >> Databáze >  >> RDS >> PostgreSQL

Načtení všech oprávnění k objektu pro konkrétní roli

Po vybalení takový pohled neexistuje, ale data potřebná k jeho vytvoření jsou v systémových katalozích:

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

Například existuje relacl pole v pg_class :

select oid::regclass, relacl from pg_class;

Podobná pole jsou i v jiných katalozích, jmenovitě typacl v pg_type a proacl v pg_proc .

Pravděpodobně budete chtít použít další dva katalogy, konkrétně pg_authid abyste věděli, které role mají oprávnění superuživatele a pg_auth_members vědět, kdo má jakou roli.

(pg_default_acl se používá pouze při vytváření objektu, takže není užitečné.)

Existuje několik interních funkcí souvisejících s aclitem, které se mohou hodit při vytváření pohledu. Můžete je uvést v psql takhle:

\df+ *acl*

Konkrétně aclexplode() . Následující příklad vám snad bude stačit, abyste mohli začít:

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;

Lze jej optimalizovat tak, že nejprve rozbalíte řádky acl, např.:

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

Dovede vás přímo k požadovanému výsledku.

Pokud jsem si vědom, je to asi tak dobré, jak to bude možné pomocí vestavěných nástrojů. (Samozřejmě si můžete napsat vlastní sadu operátorů v C, pokud byste to chtěli zkusit dále optimalizovat.)

Pokud jde o vaše dodatečné otázky, obávám se, že na ně může odpovědět jen hrstka lidí na světě, neboli samotní hlavní vývojáři. Setkávají se na seznamu hackerů pg častěji než zde.



  1. Nastavení vyšší velikosti Oracle načítání řádků zpomalí moji aplikaci?

  2. Souhrnná funkce v dotazu aktualizace SQL?

  3. Jak UPDATEXML() funguje v MariaDB

  4. Přidejte data do databáze sqlite pouze jednou a čtěte vícekrát