sql >> Base de Datos >  >> RDS >> PostgreSQL

Recuperación de todos los privilegios de objeto para un rol específico

No existe tal vista lista para usar, pero los datos necesarios para crearla están en los catálogos del sistema:

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

Por ejemplo, hay un relacl campo en pg_class :

select oid::regclass, relacl from pg_class;

Hay campos similares en otros catálogos, a saber, typacl en pg_type y proacl en pg_proc .

Presumiblemente, querrá usar dos catálogos más, a saber, pg_authid para saber qué roles tienen privilegios de superusuario y pg_auth_members para saber quién tiene qué rol.

(El pg_default_acl solo se usa durante la creación de objetos, por lo que no es útil).

Hay un par de funciones internas relacionadas con aclitem que pueden resultar útiles para crear la vista. Puede listarlos en psql así:

\df+ *acl*

En particular aclexplode() . Con suerte, el siguiente ejemplo será suficiente para comenzar:

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;

Se puede optimizar expandiendo primero las filas de ACL, por ejemplo:

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

Te llevará directamente al resultado deseado.

Hasta donde yo sé, eso es lo mejor que se puede hacer con las herramientas integradas. (Naturalmente, podría escribir su propio conjunto de operadores en C si desea intentar optimizarlo aún más).

Con respecto a sus preguntas adicionales, me temo que solo pueden ser respondidas por un puñado de personas en el mundo, también conocidas como los propios desarrolladores principales. Aparecen en la lista de hackers de pg con más frecuencia que aquí.