GRANT SELECT per tutte le tabelle in postgresql


Risposte:


145

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 .


Aggiornerò presto, quindi questa è davvero una buona notizia. Grazie!
Adam Matan,

Ciò influisce su tutti i database sul server che utilizzano lo schema pubblico?
kristianp,

5
Se creo una nuova tabella, questo utente avrà accesso alla tabella appena creata?
GuiSim,

8
@GuiSim No, devi impostare default privilegesuno schema in cui creare la tabella: postgresql.org/docs/current/static/…
SkyRaT

@kristianp No, ogni database nel cluster PG ha il suo schema pubblico. Interessa tutte le tabelle (funzioni) nello schema publicper il DB corrente a cui sei connesso.
SkyRaT,

11

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.


3
Se usi pg_stat_user_tables invece di all_tables, non hai bisogno del tuo grep ... Inoltre, passa -A -t a psql per eliminare l'output formattato.
Magnus Hagander,

1
Si noti che a partire da Postgres 9.0, l'approccio di questa risposta lo sta facendo nel modo più duro. In 9.x, ora abbiamo "ON ALL" visto in questa altra risposta .
Basil Bourque,

questo non funziona dove i nomi di tabelle o schemi contengono lettere maiuscole. Aggiunta di una versione modificata di seguito
anneb

9

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 si desidera concedere le autorizzazioni
    $bar, $baz= schemi in cui si desidera 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.


2

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

Ho finito per fare questo , e ha funzionato:

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

1

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
In inglese per favore.
Linger,

0

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.


0

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.