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

Averigüe si el usuario obtuvo permiso para seleccionar/actualizar/... una tabla/función/... en PostgreSQL

Descubrí que un mejor enfoque (y creo recordar que esto se tomó de algunas consultas integradas en psql, o tal vez las vistas de information_schema) es usar has_*_privilege y simplemente aplicarlas a un conjunto de todas las combinaciones posibles de usuario y objeto. Esto también tendrá en cuenta el acceso a un objeto a través de algún rol de grupo.

Por ejemplo, esto mostrará qué usuarios tienen qué acceso a tablas y vistas que no pertenecen al catálogo:

select usename, nspname || '.' || relname as relation,
       case relkind when 'r' then 'TABLE' when 'v' then 'VIEW' end as relation_type,
       priv
from pg_class join pg_namespace on pg_namespace.oid = pg_class.relnamespace,
     pg_user,
     (values('SELECT', 1),('INSERT', 2),('UPDATE', 3),('DELETE', 4)) privs(priv, privorder)
where relkind in ('r', 'v')
      and has_table_privilege(pg_user.usesysid, pg_class.oid, priv)
      and not (nspname ~ '^pg_' or nspname = 'information_schema')
order by 2, 1, 3, privorder;

Los posibles privilegios se detallan en la descripción del has_*_privilege funciones en http://www .postgresql.org/docs/current/static/functions-info.html#FUNCTIONS-INFO-ACCESS-TABLE .

'CREATE TEMP' es un privilegio a nivel de base de datos:permite que un usuario use un pg_temp_* esquema. Se puede probar con has_database_privilege(useroid, datoid, 'TEMP') .