sviluppo-web-qa.it

GRANT SELECT per tutte le tabelle in postgresql

Esiste un one-liner che concede SELEZIONA autorizzazioni a nuovo utente postgresql?

Qualcosa che implementerebbe il seguente pseudo-codice:

GRANT SELECT ON TABLE * TO my_new_user;
94
Adam Matan

Ho pensato che potesse essere utile menzionare che, a partire da 9.0, Postgres ha la sintassi per concedere i privilegi su tutte le tabelle (così come su altri oggetti) in uno schema:

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

Ecco il link .

153
TimH

La mia soluzione (non a linea singola):

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

Eseguito dall'utente privilegiato, ha funzionato come un fascino.

12
Adam Matan

Questo può essere fatto con un processo in due fasi.

  1. Esegui questa query:

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

    A disposizione:

    $foo = nome utente per il quale desideri concedere le autorizzazioni
    $bar, $baz = schemi in cui desideri concedere le autorizzazioni (può essere solo "pubblico")

  2. Ti fornirà un elenco di query che genereranno le autorizzazioni necessarie. Copia l'output, incollalo in un'altra query ed eseguilo.

9
Ben Williams

Ho finito per fare questo , e ha funzionato:

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

Questo è quello che ho usato:

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

Sento che è più naturale fare formattazioni e clausole where in sql ..

2
stox

Sto lavorando con Postgres 8.4 e per dare tutti i privilegi a un utente, procedi come segue:

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

Lo script (soluzione a una linea) di Adam Matan è ottimo quando ci sono molti schemi, ma non funziona dove i nomi degli schemi o delle tabelle contengono lettere maiuscole o caratteri speciali.

Versione modificata:

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

un modo per risolvere questo problema è scrivere una procedura memorizzata. sfortunatamente non esiste un comando "concedi tutto a tutte le tabelle" o giù di lì. hai davvero bisogno di una procedura o di uno script Shell esterno, forse, per farlo funzionare.

0
postgresql007