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

Find ud af, om brugeren har fået tilladelse til at vælge/opdatere/... en tabel/funktion/... i PostgreSQL

Jeg har fundet ud af, at en bedre tilgang (og jeg synes at huske, at dette blev taget fra nogle forespørgsler indbygget i psql, eller måske informationsskema-visningerne) er at bruge has_*_privilege funktioner, og blot anvende dem på et sæt af alle mulige kombinationer af bruger og objekt. Dette vil også tage højde for at have adgang til et objekt via en grupperolle.

For eksempel vil dette vise, hvilke brugere der har hvilken adgang til ikke-katalogtabeller og visninger:

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;

De mulige privilegier er detaljeret i beskrivelsen af ​​has_*_privilege funktioner på http://www .postgresql.org/docs/current/static/functions-info.html#FUNCTIONS-INFO-ACCESS-TABLE .

'CREATE TEMP' er et privilegium på databaseniveau:det tillader en bruger at bruge en pg_temp_* skema. Det kan testes med has_database_privilege(useroid, datoid, 'TEMP') .



  1. Har jeg brug for en php mysql-forbindelse i hver funktion, der bruger database?

  2. Tabelaliasing virker ikke i rå Oracle SQL-forespørgsler inde i Django

  3. JPA enum (java.lang.ClassCastException:org.postgresql.util.PGobject)

  4. Send PHP variabel til bootstrap modal