web-dev-qa-db-fra.com

GRANT SELECT à toutes les tables dans postgresql

Existe-t-il une ligne unique qui accorde les autorisations SELECT à un nouvel utilisateur postgresql?

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

GRANT SELECT ON TABLE * TO my_new_user;
94
Adam Matan

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

153
TimH

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

Exécutée par l'utilisateur privilégié, cela a fonctionné comme un charme.

12
Adam Matan

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 dans lesquels vous souhaitez accorder des autorisations (peut être simplement "public")

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

9
Ben Williams

J'ai fini par faire this , et cela a fonctionné:

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

Voici 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 dans sql ..

2
stox

Je travaille avec PostgreSQL 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
wilson

Le script (solution à une ligne) d'Adam Matan est idéal lorsqu'il existe de nombreux schémas, mais il ne fonctionne pas lorsque les noms de schéma ou de table contiennent des lettres majuscules ou des caractères spéciaux.

Version modifiée:

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

une façon de résoudre ce problème consiste à écrire une procédure stockée. malheureusement, il n'y a pas de commande "tout accorder à toutes les tables". vous avez vraiment besoin d'une procédure ou d'un script Shell externe pour que cela fonctionne.

0
postgresql007