Conceder uso/seleção 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ê tem que conceder USAGE em namespaces (esquemas) e SELECT em tabelas e visualizações individualmente assim:
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á-los um por um:
GRANT SELECT ON ALL TABLES IN SCHEMA public TO xxx;
Isso afeta apenas as tabelas que já foram criadas. Mais poderosamente, você pode ter funções padrão atribuídas automaticamente 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 os 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 das quais é membro ao criar novos objetos... 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 a 9.0)
Para evitar erros em alterações longas e em várias tabelas, é recomendável usar o seguinte processo 'automático' para gerar o
GRANT SELECT
necessário para cada tabela/visualizaçã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, exibições e sequências em público, para amor de copiar e colar. Naturalmente, isso só será aplicado às tabelas que já foram criadas.