sql >> Databasteknik >  >> RDS >> PostgreSQL

Ta reda på om användaren fick tillstånd att välja/uppdatera/... en tabell/funktion/... i PostgreSQL

Jag har funnit att ett bättre tillvägagångssätt (och jag verkar komma ihåg att detta togs från vissa frågor inbyggda i psql, eller kanske informationsschemavyerna) är att använda has_*_privilege funktioner och helt enkelt tillämpa dem på en uppsättning av alla möjliga kombinationer av användare och objekt. Detta kommer att ta hänsyn till att ha tillgång till ett objekt via någon grupproll också.

Till exempel kommer detta att visa vilka användare som har vilken åtkomst till icke-katalogtabeller och vyer:

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 möjliga privilegierna beskrivs i beskrivningen av has_*_privilege funktioner på http://www .postgresql.org/docs/current/static/functions-info.html#FUNCTIONS-INFO-ACCESS-TABLE .

'CREATE TEMP' är ett privilegium på databasnivå:det tillåter en användare att använda en pg_temp_* schema. Det kan testas med has_database_privilege(useroid, datoid, 'TEMP') .



  1. Anslutningsfel - SQLSTATE[HY000] [2002] Tidsgräns för operationen

  2. Anslut till Oracle DB från Spring-jdbc med Oracle Wallet-autentisering

  3. använder subquery istället för tabellnamnet

  4. Hur man lägger till linjenummer i SQL Server Management Studio ( SSMS) - SQL Server / TSQL självstudie del 11