sql >> Databáze >  >> RDS >> PostgreSQL

Zjistěte, zda má uživatel oprávnění vybrat/aktualizovat/... tabulku/funkci/... v PostgreSQL

Zjistil jsem, že lepší přístup (a pamatuji si, že to bylo převzato z některých dotazů zabudovaných do psql nebo možná zobrazení information_schema) je použít has_*_privilege funkce a jednoduše je aplikujte na sadu všech možných kombinací uživatele a objektu. To bude brát v úvahu i přístup k objektu prostřednictvím nějaké skupinové role.

Toto například ukáže, kteří uživatelé mají jaký přístup k nekatalogovým tabulkám a pohledům:

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;

Možná oprávnění jsou podrobně popsána v popisu has_*_privilege funkce na http://www .postgresql.org/docs/current/static/functions-info.html#FUNCTIONS-INFO-ACCESS-TABLE .

'CREATE TEMP' je privilegium na úrovni databáze:umožňuje uživateli použít pg_temp_* schéma. Lze jej otestovat pomocí has_database_privilege(useroid, datoid, 'TEMP') .



  1. PHP zobrazit obrázek BLOB z MySQL

  2. Problém získat hodnotu proměnné do mysql dotazu

  3. Součtový dotaz Mysql vrací nesprávný výsledek při použití více spojení

  4. Vypočítat max. součtu anotovaného pole nad seskupeným dotazem v Django ORM?