O motivo é que você precisa de privilégios adicionais para acessar uma visualização ou tabela. Os privilégios no banco de dados não cobrem o acesso a todos os objetos nele.
É diferente com as funções:
EXECUTE privilégio é concedido a public por padrão. Mas a função é executada com os privilégios do usuário atual. Você pode estar interessado no SECURITY DEFINER modificador para CREATE FUNCTION . Mas normalmente é suficiente conceder SELECT nas mesas envolvidas. Por documentação sobre privilégios padrão:
Dependendo do tipo de objeto, os privilégios padrão iniciais podem incluir a concessão de alguns privilégios paraPUBLIC. O padrão é sem publicaccess para tabelas, colunas, esquemas e tablespaces;CONNECTprivilégio eTEMPprivilégio de criação de tabelas para bancos de dados;EXECUTEprivilégio para funções; eUSAGEprivilégio para as línguas.
Você pode estar interessado neste comando DDL (requer Postgres 9.0 ou mais tarde):
GRANT SELECT ON ALL TABLES IN SCHEMA public TO myuser;
Enquanto estiver conectado ao banco de dados em questão, é claro (veja o comentário de @marcel abaixo), e como usuário com privilégios suficientes. Você também pode estar interessado na configuração
DEFAULT PRIVILEGES :- Conceder tudo em um esquema específico no banco de dados para uma função de grupo no PostgreSQL
Resposta mais detalhada sobre como gerenciar privilégios:
- Como gerenciar PRIVILÉGIOS PADRÃO para USUÁRIOS em um DATABASE versus SCHEMA?
O pgAdmin possui um recurso para operações em massa mais sofisticadas:
Ou você pode consultar os catálogos do sistema para criar instruções DDL para concessão/revogação em massa...