ERRO: nenhum esquema foi selecionado para criar no

38

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)?

Emanuele Paolini
fonte
3
Talvez seu usuário não tenha os privilégios necessários para criar tabelas no esquema público.
A_horse_with_no_name
Após a edição: sim, conecte-se ao modelo1 e verifique as permissões do esquema (consulte a resposta editada).
Daniel Vérité

Respostas:

34

Isso acontece quando não há USAGEprivilégios em nenhum dos esquemas de search_path. Por padrão, a pseudo-função public(todos os usuários) possui esse privilégio no publicesquema, portanto, esse erro ocorre somente após revogá-lo explicitamente com:

revoke usage on schema public from public;

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 REVOKEnã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 (consulte CREATE DATABASE).


Quando um usuário tem USAGEprivilégio, mas não possui CREATEprivilé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 \xpara facilitar a leitura):

# \ dn + público
Lista de esquemas
- [GRAVAÇÃO 1] ----- + -----------------------
Nome público
Proprietário postgres
Privilégios de acesso | postgres = UC / postgres
                  | = UC / postgres
Descrição esquema público padrão

a falta de um nome de rolo antes =significa que é para todas as funções (= pública)

Sem privilégio público de USAGE

Nome público
Proprietário postgres
Privilégios de acesso | postgres = UC / postgres
                  | = C / postgres
Descrição esquema público padrão

Sem privilégios públicos de USAGE ou CREATE

Nome público
Proprietário postgres
Privilégios de acesso | postgres = UC / postgres
Descrição esquema público padrão
Daniel Vérité
fonte
Obrigado, isso resolvido! (Vou escrever uma nota na pergunta).
Emanuele Paolini
3

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

ERROR:  no schema has been selected to create in

Para o meu caso, o erro ocorre quando no início da linha de despejo atual

SELECT pg_catalog.set_config('search_path', '', false);

Eu mudei o segundo argumento para "público"

SELECT pg_catalog.set_config('search_path', 'public', false);

E o problema se foi

Panoptik
fonte