Estou trabalhando em um banco de dados postgresql Amazon RDS onde sei que houve algum problema com o esquema público (talvez tenha sido descartado). Mas aparentemente o esquema existe, e de qualquer forma o problema não foi resolvido. Aqui está uma sessão de amostra com um banco de dados vazio recém-criado:
mydb=> CREATE TABLE distributors (
mydb(> did integer,
mydb(> name varchar(40) UNIQUE
mydb(> );
ERROR: no schema has been selected to create in
mydb=> show search_path;
search_path
----------------
"$user",public
(1 row)
mydb=> create schema public;
ERROR: schema "public" already exists
Alguma dica? O que devo procurar?
Resolvido. Graças à resposta de Daniel Vérité resolvi com o seguinte:
grant usage on schema public to public;
grant create on schema public to public;
Essas são as permissões padrão no esquema público?
Eu tenho um único usuário que pode acessar o banco de dados, então acho que isso não pode aumentar os riscos de segurança ...
Acho que devo fazer a mesma modificação no template1 . Está correto? Como posso verificar se as permissões em template1 estão corretas (digamos, valores padrão)?
Isso acontece quando não se tem
USAGE
privilégio em nenhum dos esquemas dosearch_path
. Por padrão o pseudo-rolepublic
(todos os usuários) tem esse privilégio nopublic
esquema, então esse erro acontece somente após revogá-lo explicitamente com:Isso é necessário quando não é desejável que as pessoas espiem os esquemas de outras pessoas, mesmo sem selecionar dados de tabelas (o que é concedido por meio de diferentes privilégios).
Se isso
REVOKE
não foi feito nesse banco de dados, pode ter acontecido no banco de dados modelo pelo qual novos bancos de dados são modelados (consulte RecursosCREATE DATABASE
).Quando um usuário tem
USAGE
privilégio, mas não temCREATE
privilégio no esquema, é um erro diferente ao tentar criar um objeto: permissão negada para esquema public .Para verificar os privilégios dentro do psql, use
\dn+ public
.Por padrão (mostrado com exibição estendida
\x
para facilitar a leitura):a falta de um nome de função antes
=
significa que é para todas as funções (= público)Sem privilégio de USAGE público
Sem privilégios públicos USAGE ou CREATE
Eu tinha o arquivo pgdump com a criação de funções no esquema personalizado e queria mudar o nome do esquema personalizado para público geral e substituí todas as ocorrências pelo esquema antigo para vazio (por exemplo, myschema.tablename para tablename) E comecei a receber erro
Para o meu caso, o erro acontece quando no início da linha de despejo atual
Eu mudei o segundo argumento para "público"
E o problema acabou
Eu tentei várias soluções e continuo recebendo o mesmo erro repetidamente.
Pior que isso, o erro me aparece quando precisei reiniciar a migração do meu banco de dados excluindo o esquema público e após criá-lo novamente.
A correção foi:
Isso estava acontecendo comigo depois que tentei me conectar a um dump de banco de dados recém-importado com o usuário que criei anteriormente. O que resolveu foi conceder as permissões ao usuário:
GRANT ALL ON SCHEMA public TO custom_user;
Isso funciona para mim