PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como você cria um usuário somente leitura no PostgreSQL?

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.