PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Recuperando todos os privilégios de objeto para uma função específica


Não existe essa visualização pronta para uso, mas os dados necessários para criá-la estão nos catálogos do sistema:

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

Por exemplo, há um relacl campo em pg_class :
select oid::regclass, relacl from pg_class;

Existem campos semelhantes em outros catálogos, nomeadamente typacl em pg_type e proacl em pg_proc .

Você provavelmente desejará usar mais dois catálogos, a saber, pg_authid para saber quais funções têm privilégios de superusuário e pg_auth_members saber quem tem qual papel.

(O pg_default_acl é usado apenas durante a criação do objeto, portanto, não é útil.)

Existem algumas funções internas relacionadas ao aclitem que podem ser úteis na criação da exibição. Você pode listá-los em psql igual a:
\df+ *acl*

Em particular aclexplode() . Esperamos que o exemplo a seguir seja suficiente para você começar:
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;

Ele pode ser otimizado expandindo primeiro as linhas acl, por exemplo:
select oid::regclass,
       aclitem.grantee
from (select oid, aclexplode(relacl) as aclitem from pg_class) sub

Ele vai te levar direto ao resultado desejado.

Até onde eu sei, isso é o melhor possível usando as ferramentas internas. (Naturalmente, você pode escrever seu próprio conjunto de operadores em C se quiser tentar otimizar ainda mais.)

Com relação às suas perguntas extras, temo que elas só possam ser respondidas por um punhado de pessoas no mundo, também conhecidas como os próprios desenvolvedores principais. Eles ficam na lista de hackers da página com mais frequência do que aqui.