Conceder uso / selecionar a uma única tabela
Se você conceder apenas CONNECT a um banco de dados, o usuário poderá se conectar, mas não terá outros privilégios. Você deve conceder USAGE em namespaces (esquemas) e SELECT em tabelas e visualizações individualmente da seguinte forma:
GRANT CONNECT ON DATABASE mydb TO xxx;
-- This assumes you're actually connected to mydb..
GRANT USAGE ON SCHEMA public TO xxx;
GRANT SELECT ON mytable TO xxx;
Várias tabelas / visualizações (PostgreSQL 9.0+)
Nas versões mais recentes do PostgreSQL, você pode conceder permissões em todas as tabelas / visualizações / etc no esquema usando um único comando, em vez de digitá-las uma a uma:
GRANT SELECT ON ALL TABLES IN SCHEMA public TO xxx;
Isso afeta apenas tabelas que já foram criadas. Mais poderosamente, você pode automaticamente atribuir funções padrão a novos objetos no futuro:
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT ON TABLES TO xxx;
Observe que, por padrão, isso afetará apenas objetos (tabelas) criados pelo usuário que emitiu este comando: embora também possa ser definido em qualquer função da qual o usuário emissor seja membro. No entanto, você não obtém privilégios padrão para todas as funções de que você é membro ao criar novos objetos ... então ainda há alguns problemas por aí. Se você adotar a abordagem de que um banco de dados tem uma função proprietária e as alterações de esquema são executadas como essa função proprietária, você deve atribuir privilégios padrão a essa função proprietária. IMHO, tudo isso é um pouco confuso e você pode precisar experimentar para criar um fluxo de trabalho funcional.
Várias tabelas / visualizações (versões do PostgreSQL anteriores à 9.0)
Para evitar erros em alterações longas e com várias tabelas, é recomendável usar o seguinte processo 'automático' para gerar o necessário GRANT SELECT
para cada tabela / exibição:
SELECT 'GRANT SELECT ON ' || relname || ' TO xxx;'
FROM pg_class JOIN pg_namespace ON pg_namespace.oid = pg_class.relnamespace
WHERE nspname = 'public' AND relkind IN ('r', 'v', 'S');
Isso deve gerar os comandos GRANT relevantes para GRANT SELECT em todas as tabelas, visualizações e sequências em público, para o amor de copiar e colar. Naturalmente, isso será aplicado apenas a tabelas que já foram criadas.
REVOKE CREATE ON SCHEMA public FROM PUBLIC;
. Sem isso, o usuário "somente leitura" não pode modificar as tabelas existentes, mas pode criar novas tabelas no esquema e adicionar / remover dados dessas tabelas.psql mydb
outras coisas que a maioria dessas manipulações não faria. Pessoalmente, levei um tempo considerável para descobrir sozinho. Espero que isso ajude alguém.Observe que o PostgreSQL 9.0 (hoje em teste beta) terá uma maneira simples de fazer isso :
fonte
Referência retirada deste blog:
Script para criar usuário somente leitura:
Atribua permissão a este usuário somente leitura:
Atribua permissões para ler todas as novas tabelas criadas no futuro
fonte
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO Read_Only_User;
que também permitiria ler todas as tabelas criadas no mesmo banco de dados no futuro.INSERT
s.GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA schema_name TO Read_Only_User;
GRANT ALL ON ALL SEQUENCES IN SCHEMA schema_name TO Read_Only_User
:?Aqui está a melhor maneira que eu encontrei para adicionar usuários somente leitura (usando o PostgreSQL 9.0 ou mais recente):
Em seguida, efetue login em todas as máquinas relacionadas (master + read-slave (s) / hot-standby (s), etc.) e execute:
fonte
Por padrão, novos usuários terão permissão para criar tabelas. Se você planeja criar um usuário somente leitura, provavelmente não é isso que você deseja.
Para criar um verdadeiro usuário somente leitura com o PostgreSQL 9.0+, execute as seguintes etapas:
Se o usuário somente leitura não tiver permissão para listar tabelas (ou seja,
\d
não retorna resultados), provavelmente é porque você não temUSAGE
permissões para o esquema.USAGE
é uma permissão que permite aos usuários realmente usar as permissões que foram atribuídas. Qual o sentido disso? Não tenho certeza. Consertar:fonte
Eu criei um script conveniente para isso; pg_grant_read_to_db.sh . Esse script concede privilégios somente leitura a uma função especificada em todas as tabelas, visualizações e sequências em um esquema de banco de dados e os define como padrão.
fonte
Eu li através de todas as soluções possíveis, tudo bem, se você se lembrar de se conectar ao banco de dados antes de conceder as coisas;) De qualquer forma, obrigado por todas as outras soluções !!!
crie usuário psql:
inicie o psql cli e defina uma senha para o usuário criado:
conecte-se ao banco de dados de destino:
conceda todos os privilégios necessários:
altere privilégios padrão para destinos db public shema:
fonte
Se seu banco de dados estiver no esquema público, é fácil (isso pressupõe que você já criou o
readonlyuser
)Se seu banco de dados estiver usando
customschema
, execute o procedimento acima, mas adicione mais um comando:fonte
A maneira não simples de fazer isso seria conceder a seleção em cada tabela do banco de dados:
Você pode automatizar isso gerando suas instruções de concessão a partir dos metadados do banco de dados.
fonte
fonte
Retirado de um link publicado em resposta ao link despesz ' .
O Postgres 9.x parece ter a capacidade de fazer o que é solicitado. Consulte o parágrafo Conceder sobre objetos de banco de dados de:
http://www.postgresql.org/docs/current/interactive/sql-grant.html
Onde diz: "Também há uma opção para conceder privilégios em todos os objetos do mesmo tipo em um ou mais esquemas. Atualmente, essa funcionalidade é suportada apenas por tabelas, sequências e funções (mas observe que TODAS AS TABELAS são consideradas como exibições de exibição e tabelas estrangeiras) ".
Esta página também discute o uso de ROLEs e um PRIVILEGE chamado "ALL PRIVILEGES".
Também estão presentes informações sobre como as funcionalidades do GRANT se comparam aos padrões SQL.
fonte