Existe uma linha que conceda as permissões SELECT para um novo usuário postgresql?
Algo que implementaria o seguinte pseudocódigo:
GRANT SELECT ON TABLE * TO my_new_user;
Existe uma linha que conceda as permissões SELECT para um novo usuário postgresql?
Algo que implementaria o seguinte pseudocódigo:
GRANT SELECT ON TABLE * TO my_new_user;
Respostas:
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 .
default privileges
esquema em que cria a tabela: postgresql.org/docs/current/static/…
public
do banco de dados atual ao qual você está conectado.
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.
Isso pode ser feito com um processo de duas etapas.
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")
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.
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
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.
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