Question GRANT SELECT à toutes les tables de postgresql


Y a-t-il un one-liner qui accorde la Autorisations SELECT à un nouvel utilisateur postgresql?

Quelque chose qui implémenterait le pseudo-code suivant:

GRANT SELECT ON TABLE * TO my_new_user;

77
2017-08-30 14:11


origine




Réponses:


J'ai pensé qu'il pourrait être utile de mentionner qu'à partir de la version 9.0, postgres dispose de la syntaxe pour octroyer des privilèges sur toutes les tables (ainsi que sur d'autres objets) dans 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.


131
2018-06-26 14:00



J'améliorerai bientôt, c'est donc une très bonne nouvelle. Merci! - Adam Matan
Cela affecte-t-il toutes les bases de données sur le serveur qui utilisent le schéma public? - kristianp
Si je crée une nouvelle table, cet utilisateur aura-t-il accès à la table nouvellement créée? - GuiSim
@GuiSim Non, vous devez définir le default privileges sur un schéma, où vous créez la table: postgresql.org/docs/current/static/… - SkyRaT
@kristianp Non, chaque base de données du cluster PG a son propre schéma public. Cela affecte toutes les tables (fonctions) du schéma public pour le DB actuel auquel vous êtes connecté. - SkyRaT


Ma solution (non-one-liner):

#!/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

Couru de l'utilisateur privilégié, cela a fonctionné comme un charme.


11
2018-06-01 06:29



Si vous utilisez pg_stat_user_tables au lieu de all_tables, vous n'avez pas besoin de votre grep ... De plus, transmettez -A -t à psql pour supprimer les sorties formatées. - Magnus Hagander
Notez que depuis Postgres 9.0, l'approche de cette réponse est difficile. Dans 9.x, nous avons maintenant le "ON ALL" vu dans cette autre réponse. - Basil Bourque


Cela peut être fait avec 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;
    

    Remplaçants:

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

  2. Cela va vous donner une liste de requêtes qui généreront les autorisations requises. Copiez le résultat, collez-le dans une autre requête et exécutez-le.


8
2017-08-05 13:25





C'est ce que j'ai utilisé:

psql dbname -tc "select 'grant select on '||relname||' to readonly;' from pg_stat_user_tables" | psql dbname

Je pense qu'il est plus naturel de faire du formatage et des clauses where en SQL.


2
2017-11-30 00:38





Je travaille avec postgres 8.4 et pour donner tous les privilèges à un utilisateur, procédez comme suit:

#!/bin/bash

for table in `echo "SELECT schemaname||'.'||relname FROM pg_stat_all_tables WHERE schemaname NOT IN('pg_catalog','pg_toast','information_schema')" | psql -t db `;
do
    echo "grant select on table $table to my_new_user;"
    echo "grant select on table $table to my_new_user;" | psql db
done

1
2018-04-05 18:04



En anglais s'il vous plait. - Linger


Un moyen de résoudre ce problème consiste à écrire une procédure stockée. Malheureusement, il n'y a pas de commande "Tout attribuer à toutes les tables". vous avez vraiment besoin d'une procédure ou d'un script shell externe pour que cela fonctionne.


0
2017-07-03 18:20





J'ai fini par faire ceet cela a fonctionné:

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

0