PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Scopri se l'utente ha ottenuto il permesso di selezionare/aggiornare/... una tabella/funzione/... in PostgreSQL

Ho scoperto che un approccio migliore (e mi sembra di ricordare che questo è stato preso da alcune query integrate in psql, o forse le views_schema di informazioni) consiste nell'usare has_*_privilege funzioni e applicarle semplicemente a un insieme di tutte le possibili combinazioni di utente e oggetto. Ciò terrà conto anche dell'accesso a un oggetto tramite un ruolo di gruppo.

Ad esempio, questo mostrerà quali utenti hanno accesso a tabelle e viste non di catalogo:

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;

I possibili privilegi sono dettagliati nella descrizione del has_*_privilege funzioni su http://www .postgresql.org/docs/current/static/functions-info.html#FUNCTIONS-INFO-ACCESS-TABLE .

'CREATE TEMP' è un privilegio a livello di database:consente a un utente di utilizzare un pg_temp_* schema. Può essere testato con has_database_privilege(useroid, datoid, 'TEMP') .