PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Finden Sie heraus, ob der Benutzer die Berechtigung zum Auswählen/Aktualisieren/... einer Tabelle/Funktion/... in PostgreSQL erhalten hat

Ich habe festgestellt, dass ein besserer Ansatz (und ich meine mich zu erinnern, dass dies aus einigen in psql integrierten Abfragen oder vielleicht den information_schema-Ansichten übernommen wurde) darin besteht, das has_*_privilege zu verwenden Funktionen, und wenden Sie sie einfach auf eine Menge aller möglichen Kombinationen von Benutzer und Objekt an. Dies berücksichtigt auch den Zugriff auf ein Objekt über eine Gruppenrolle.

So wird beispielsweise angezeigt, welche Benutzer welchen Zugriff auf Nicht-Katalog-Tabellen und -Ansichten haben:

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;

Die möglichen Privilegien sind in der Beschreibung des has_*_privilege aufgeführt Funktionen unter http://www .postgresql.org/docs/current/static/functions-info.html#FUNCTIONS-INFO-ACCESS-TABLE .

„CREATE TEMP“ ist ein Privileg auf Datenbankebene:Es erlaubt einem Benutzer, ein pg_temp_* zu verwenden Schema. Es kann mit has_database_privilege(useroid, datoid, 'TEMP') getestet werden .