Esiste un one-liner che concede le autorizzazioni SELECT a un nuovo utente postgresql?
Qualcosa che implementerebbe il seguente pseudo-codice:
GRANT SELECT ON TABLE * TO my_new_user;
Esiste un one-liner che concede le autorizzazioni SELECT a un nuovo utente postgresql?
Qualcosa che implementerebbe il seguente pseudo-codice:
GRANT SELECT ON TABLE * TO my_new_user;
Risposte:
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 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 .
default privileges
uno schema in cui creare la tabella: postgresql.org/docs/current/static/…
public
per il DB corrente a cui sei connesso.
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.
Questo può essere fatto con un processo in due fasi.
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 si desidera concedere le autorizzazioni
$bar
, $baz
= schemi in cui si desidera concedere le autorizzazioni (può essere solo "pubblico")
Ti fornirà un elenco di query che genereranno le autorizzazioni necessarie. Copia l'output, incollalo in un'altra query ed eseguilo.
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
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 di shell esterno, forse per farlo funzionare.
Lo script (one-liner solution) 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