170 votes

GRANT SELECT à toutes les tables dans postgresql

Existe-t-il une ligne unique qui accorde le SELECTIONNER les permissions à un nouvel utilisateur postgresql ?

Quelque chose qui mettrait en œuvre le pseudo-code suivant :

GRANT SELECT ON TABLE * TO my_new_user;

276voto

TimH Points 2316

J'ai pensé qu'il serait utile de mentionner que, depuis la version 9.0, postgres dispose de la syntaxe permettant d'accorder des privilèges sur toutes les tables (ainsi que sur d'autres objets) d'un schéma :

GRANT SELECT ON ALL TABLES IN SCHEMA public TO user;
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public TO user;

Voici le lien .

16voto

olinarr Points 2861

Ma solution (sans commentaire) :

#!/bin/bash

for table in `echo "SELECT schemaname || '.' || relname FROM pg_stat_user_tables;" | psql -A -t my_database_name`;
do
    echo "GRANT SELECT ON TABLE $table to my_new_user;"
    echo "GRANT SELECT ON TABLE $table to my_new_user;" | psql my_database_name
done

Exécuté depuis l'utilisateur privilégié, il a fonctionné comme un charme.

12voto

Ben Williams Points 719

Cela peut se faire par un processus en deux étapes.

  1. Exécutez cette requête :

    select 'grant all on '||schemaname||'.'||tablename||' to $foo;'
    from pg_tables where schemaname in ('$bar', '$baz')
    order by schemaname, tablename;

    Remplacements :

    $foo = nom d'utilisateur pour lequel vous voulez accorder des permissions
    $bar , $baz = schémas dans lesquels vous voulez accorder des permissions (peut être simplement "public")

  2. Cela va vous donner une liste de requêtes qui vont générer les autorisations requises. Copiez la sortie, collez-la dans une autre requête, et exécutez.

11voto

szeitlin Points 191

J'ai fini par faire este et ça a marché :

ALTER DEFAULT PRIVILEGES IN SCHEMA public 
GRANT SELECT ON TABLES TO PUBLIC;

6voto

CraZ Points 160

Je me suis retrouvé ici parce que l'utilisateur de ma base de données n'a vu que quelques tables et pas les plus récentes. Si c'est votre cas, ceci m'a aidé.

  1. Accorder des privilèges à tous existant tables :

    GRANT SELECT ON ALL TABLES IN SCHEMA public TO user;
  2. Accorder des privilèges à tous nouveau les tables à créer à l'avenir (via les privilèges par défaut) :

    ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO user;
  3. Vous pouvez également vérifier que toutes les tables sont accordées correctement.

    • Comptez toutes les tables existantes :

      SELECT COUNT(*)
      FROM pg_catalog.pg_tables
      WHERE schemaname != 'pg_catalog' AND
            schemaname != 'information_schema';
    • Comptez toutes les tables auxquelles l'utilisateur a accès :

      SELECT COUNT(*)
      FROM information_schema.role_table_grants
      WHERE grantee = 'user';

    Le compte des deux dernières requêtes doit être le même.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X