GRANT SELECT para todas as tabelas no postgresql

Respostas:

145

Eu pensei que poderia ser útil mencionar que, a partir do 9.0, o postgres tem a sintaxe para conceder privilégios em todas as tabelas (assim como em outros objetos) em um esquema:

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

Aqui está o link .

TimH
fonte
Vou atualizar em breve, então são realmente boas notícias. Obrigado!
26811 Adam Matan
Isso afeta todos os bancos de dados no servidor que usam o esquema público?
Kristianp #
5
Se eu criar uma nova tabela, esse usuário terá acesso à tabela recém-criada?
GuiSim 5/09/14
8
@GuiSim Não, você precisa definir o default privilegesesquema em que cria a tabela: postgresql.org/docs/current/static/…
SkyRaT
@kristianp Não, todo banco de dados no cluster PG possui seu próprio esquema público. Isso afeta todas as tabelas (funções) no esquema publicdo banco de dados atual ao qual você está conectado.
SkyRaT
11

Minha solução (sem uma linha):

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

Execute a partir do usuário privilegiado, funcionou como um encanto.

Adam Matan
fonte
3
Se você usar pg_stat_user_tables em vez de all_tables, não precisará do seu grep ... Além disso, passe -A -t ao psql para se livrar da saída formatada.
Magnus Hagander 30/08/09
1
Observe que, a partir do Postgres 9.0, a abordagem desta resposta está fazendo da maneira mais difícil. No 9.x, agora temos o "ON ALL" visto nesta outra resposta .
Basil Bourque
este não funciona onde nomes de tabelas ou esquemas contenham letras maiúsculas. Adicionando uma versão modificada abaixo
anneb 26/03
9

Isso pode ser feito com um processo de duas etapas.

  1. Execute esta consulta:

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

    Substituições:

    $foo= nome de usuário para o qual você deseja conceder permissões
    $bar, $baz= esquemas nos quais você deseja conceder permissões (pode ser apenas "público")

  2. Isso fornecerá uma lista de consultas que gerarão as permissões necessárias. Copie a saída, cole-a em outra consulta e execute.

Ben Williams
fonte
2

Isto é o que eu usei:

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

Eu acho que é mais natural fazer formatação e cláusulas where em sql.

stox
fonte
2

Acabei fazendo isso e funcionou:

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

Estou trabalhando com o postgres 8.4 e para conceder todos os privilégios a um usuário, faça o seguinte:

#!/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
Wilson
fonte
1
Em inglês por favor.
quer
0

Uma maneira de corrigir isso é escrever um procedimento armazenado. infelizmente não há um comando "conceder tudo para todas as tabelas" ou algo assim. você realmente precisa de um procedimento ou algum script de shell externo, talvez, para fazer isso funcionar.

postgresql007
fonte
0

O script (solução de uma linha) de Adam Matan é excelente quando existem muitos esquemas, mas não funciona onde nomes de esquemas ou tabelas contenham letras maiúsculas ou caracteres especiais.

Versão modificada:

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