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.