Eu tinha um esquema 'público' e uma função simples no esquema chamado 'isvalidoption'.
O que foi feito:
- esquema de backup usando pg_dump;
- renomeie o esquema para 'desenvolvimento';
- criar novo esquema 'público';
- restaure-o do backup usando pg_restore.
O problema:
- quando eu seleciono de qualquer tabela omitindo o prefixo do esquema como 'SELECT * FROM mytable;' tudo bem
- quando executo função com prefixo de esquema como 'SELECT public.isvalidoption();' ou 'SELECT development.isvalidoption()' está OK;
- quando executo a função omitindo o prefixo do esquema como 'SELECT isvalidoption();' Recebo ERRO: permissão negada para a função isvalidoption
O usuário tem USAGE em ambos os esquemas e EXECUTE na função em ambos os esquemas, além de ser proprietário da função em ambos os esquemas.
A versão do PostgreSQL é 9.6.1.
'SELECT usuário_atual;' mostra o usuário correto.
'SHOW search_path;' mostra '"$user", public'.
Alguma ideia?
Após horas de leitura da documentação, descobri que o PosgreSQL primeiro pesquisa o esquema pg_catalog antes mesmo de todos os esquemas listados em search_path.
Então verifiquei o catálogo pg_catalog e não sei porque, mas minha função foi definida lá e o usuário postgres era o proprietário da função.
Acabei de excluir minha função do pg_catalog e está OK e funciona perfeitamente como esperado.
Ainda não sei como a função chegou lá no pg_catalog.