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

Descubra se o usuário tem permissão para selecionar/atualizar/... uma tabela/função/... no PostgreSQL


Descobri que uma abordagem melhor (e lembro que isso foi tirado de algumas consultas embutidas no psql, ou talvez das visualizações information_schema) é usar o has_*_privilege funções, e simplesmente aplicá-los a um conjunto de todas as combinações possíveis de usuário e objeto. Isso também levará em conta o acesso a um objeto por meio de alguma função de grupo.

Por exemplo, isso mostrará quais usuários têm acesso a tabelas e visualizações que não são de 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;

Os possíveis privilégios estão detalhados na descrição do has_*_privilege funções em http://www .postgresql.org/docs/current/static/functions-info.html#FUNCTIONS-INFO-ACCESS-TABLE .

'CREATE TEMP' é um privilégio de nível de banco de dados:ele permite que um usuário use um pg_temp_* esquema. Ele pode ser testado com has_database_privilege(useroid, datoid, 'TEMP') .