Estou trabalhando em um banco de dados RDS postgresql da Amazon, onde sei que houve algum problema com o esquema público (talvez ele tenha sido descartado). Mas, aparentemente, o esquema existe e, de qualquer maneira, o problema não está 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 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 no modelo1 estão corretas (por exemplo, valores padrão)?
fonte
Respostas:
Isso acontece quando não há
USAGE
privilégios em nenhum dos esquemas desearch_path
. Por padrão, a pseudo-funçãopublic
(todos os usuários) possui esse privilégio nopublic
esquema, portanto, esse erro ocorre somente após revogá-lo explicitamente com:Isso é necessário quando não é desejável que as pessoas espiem outros esquemas de pessoas, mesmo sem selecionar dados das tabelas (que são concedidas por diferentes privilégios).
Se isso
REVOKE
não foi feito nesse banco de dados, pode ter acontecido no banco de dados modelo pelo qual os novos bancos de dados são modelados (consulteCREATE DATABASE
).Quando um usuário tem
USAGE
privilégio, mas não possuiCREATE
privilégio no esquema, é um erro diferente ao tentar criar um objeto: permissão negada para público do esquema .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 rolo antes
=
significa que é para todas as funções (= pública)Sem privilégio público de USAGE
Sem privilégios públicos de USAGE ou CREATE
fonte
Eu tinha o arquivo pgdump com a criação de funções no esquema personalizado e queria mudar o nome do esquema personalizado para o público em geral e substitui 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 ocorre quando no início da linha de despejo atual
Eu mudei o segundo argumento para "público"
E o problema se foi
fonte