121 votes

Accords de requête pour une table dans postgres

Comment puis-je interroger tous les GRANTS accordés à un objet dans postgres ?

Par exemple j'ai la table "mytable":

 GRANT SELECT, INSERT ON mytable TO user1
GRANT UPDATE ON mytable TO user2 

J'ai besoin de quelque chose qui me donne :

 user1: SELECT, INSERT
user2: UPDATE

139voto

markus Points 748

je l'ai déjà trouvé :

 SELECT grantee, privilege_type 
FROM information_schema.role_table_grants 
WHERE table_name='mytable'

113voto

CPJ Points 1515

\z mytable de psql vous donne toutes les autorisations d'une table, mais vous devrez alors la diviser par utilisateur individuel.

46voto

shruti Points 437

La requête ci-dessous vous donnera une liste de tous les utilisateurs et de leurs autorisations sur la table dans un schéma.

 select a.schemaname, a.tablename, b.usename,
  HAS_TABLE_PRIVILEGE(usename, quote_ident(schemaname) || '.' || quote_ident(tablename), 'select') as has_select,
  HAS_TABLE_PRIVILEGE(usename, quote_ident(schemaname) || '.' || quote_ident(tablename), 'insert') as has_insert,
  HAS_TABLE_PRIVILEGE(usename, quote_ident(schemaname) || '.' || quote_ident(tablename), 'update') as has_update,
  HAS_TABLE_PRIVILEGE(usename, quote_ident(schemaname) || '.' || quote_ident(tablename), 'delete') as has_delete, 
  HAS_TABLE_PRIVILEGE(usename, quote_ident(schemaname) || '.' || quote_ident(tablename), 'references') as has_references 
from pg_tables a, pg_user b 
where a.schemaname = 'your_schema_name' and a.tablename='your_table_name';

Plus de détails sur has_table_privilages peuvent être trouvés ici .

34voto

Nico Points 97

Si vous voulez vraiment une ligne par utilisateur, vous pouvez regrouper par bénéficiaire (nécessite PG9+ pour string_agg)

 SELECT grantee, string_agg(privilege_type, ', ') AS privileges
FROM information_schema.role_table_grants 
WHERE table_name='mytable'   
GROUP BY grantee;

Cela devrait afficher quelque chose comme :

  grantee |   privileges   
---------+----------------
 user1   | INSERT, SELECT
 user2   | UPDATE
(2 rows)

11voto

Igal Points 836

Cette requête répertoriera toutes les tables de toutes les bases de données et schémas (décommentez la ou les lignes de la WHERE pour filtrer des bases de données, des schémas ou des tables spécifiques), avec les privilèges affichés dans l'ordre afin qu'il soit facile de voir si un privilège spécifique est accordé ou non :

 SELECT grantee
      ,table_catalog
      ,table_schema
      ,table_name
      ,string_agg(privilege_type, ', ' ORDER BY privilege_type) AS privileges
FROM information_schema.role_table_grants 
WHERE grantee != 'postgres' 
--  and table_catalog = 'somedatabase' /* uncomment line to filter database */
--  and table_schema  = 'someschema'   /* uncomment line to filter schema  */
--  and table_name    = 'sometable'    /* uncomment line to filter table  */
GROUP BY 1, 2, 3, 4;

Exemple de sortie :

 grantee |table_catalog   |table_schema  |table_name     |privileges     |
--------|----------------|--------------|---------------|---------------|
PUBLIC  |adventure_works |pg_catalog    |pg_sequence    |SELECT         |
PUBLIC  |adventure_works |pg_catalog    |pg_sequences   |SELECT         |
PUBLIC  |adventure_works |pg_catalog    |pg_settings    |SELECT, UPDATE |
...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X