ОШИБКА: схема не была выбрана для создания в


38

Я работаю над базой данных Amazon RDS postgresql, где я знаю, что была какая-то проблема с общедоступной схемой (возможно, она была удалена). Но, видимо, схема существует, и в любом случае проблема не решена. Вот пример сеанса с недавно созданной пустой базой данных:

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

Любой намек? Что я должен искать?

Решаемые. Благодаря ответу Даниэля Верите я решил следующее:

grant usage on schema public to public;
grant create on schema public to public;

Это разрешения по умолчанию для общедоступной схемы?

У меня есть один пользователь, который может получить доступ к базе данных, так что я думаю, что в любом случае это не может повысить риски безопасности

Я думаю, что я должен сделать такую ​​же модификацию на template1 . Это правильно? Как я могу проверить правильность разрешений в template1 (скажем, значения по умолчанию)?


3
Возможно, у вашего пользователя нет необходимых прав для создания таблиц в публичной схеме.
a_horse_with_no_name

После редактирования: да, подключитесь к template1 и проверьте права доступа к схеме (см. Отредактированный ответ).
Даниэль Верите

Ответы:


34

Это происходит, когда у вас нет USAGEправ доступа ни к одной из схем search_path. По умолчанию псевдоролевая роль public(все пользователи) имеет эту привилегию в publicсхеме, поэтому эта ошибка возникает только после явного ее отзыва с помощью:

revoke usage on schema public from public;

Это необходимо, когда нежелательно, чтобы люди заглядывали в схемы других людей, даже не выбирая данные из таблиц (что предоставляется с помощью других привилегий).

Если это REVOKEне было сделано в этой базе данных, это могло произойти в базе данных шаблонов, с помощью которой моделируются новые базы данных (см. CREATE DATABASE).


Когда пользователь имеет USAGEпривилегию, но не имеет CREATEпривилегии в схеме, при попытке создать объект возникает другая ошибка: в доступе к схеме отказано в общедоступной схеме .

Чтобы проверить привилегии внутри psql, используйте \dn+ public.

По умолчанию (показывается с расширенным дисплеем \xдля удобства чтения):

# \ dn + public
Список схем
- [ЗАПИСЬ 1] ----- + -----------------------
Имя | общественности
Владелец | Postgres
Права доступа | Postgres = UC / Postgres
                  | = UC / Postgres
Описание | стандартная общедоступная схема

Отсутствие роли перед именем =означает, что это для всех ролей (= public)

Без публичной привилегии USAGE

Имя | общественности
Владелец | Postgres
Права доступа | Postgres = UC / Postgres
                  | = C / Postgres
Описание | стандартная общедоступная схема

Без публичных привилегий USAGE или CREATE

Имя | общественности
Владелец | Postgres
Права доступа | Postgres = UC / Postgres
Описание | стандартная общедоступная схема

Спасибо, это решено! (Напишу заметку в вопросе).
Эмануэле Паолини

3

У меня был файл pgdump с созданием функций в настраиваемой схеме, и я хотел переключить имя настраиваемой схемы на общедоступную и заменил все вхождения старой схемой на пустую (например, myschema.tablename на tablename) И начал получать ошибку

ERROR:  no schema has been selected to create in

Для моего случая ошибка происходит, когда в начале дампа присутствует строка

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

Я изменил второй аргумент в «public»

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

И проблема ушла

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.