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;CONNECT
privilégio eTEMP
privilégio de criação de tabelas para bancos de dados;EXECUTE
privilégio para funções; eUSAGE
privilé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...