PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Découvrez si l'utilisateur a obtenu la permission de sélectionner/mettre à jour/... une table/fonction/... dans PostgreSQL

J'ai trouvé qu'une meilleure approche (et je crois me souvenir que cela a été tiré de certaines requêtes intégrées à psql, ou peut-être des vues information_schema) consiste à utiliser le has_*_privilege fonctions, et appliquez-les simplement à un ensemble de toutes les combinaisons possibles d'utilisateur et d'objet. Cela tiendra également compte de l'accès à un objet via un rôle de groupe.

Par exemple, cela montrera quels utilisateurs ont quel accès aux tables et vues hors catalogue :

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;

Les privilèges possibles sont détaillés dans la description du has_*_privilege fonctionne sur http://www .postgresql.org/docs/current/static/functions-info.html#FUNCTIONS-INFO-ACCESS-TABLE .

'CREATE TEMP' est un privilège au niveau de la base de données :il permet à un utilisateur d'utiliser un pg_temp_* schéma. Il peut être testé avec has_database_privilege(useroid, datoid, 'TEMP') .