ПОМИЛКА: для створення в системі не обрано жодної схеми


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 + загальнодоступна
Список схем
- [ЗАПИС 1] ----- + -----------------------
Назва | громадські
Власник | постгреси
Права доступу | postgres = UC / postgres
                  | = UC / postgres
Опис | стандартна загальнодоступна схема

відсутність імені ролі раніше =означає, що це для всіх ролей (= загальнодоступне)

Без публічної пільги на використання

Назва | громадські
Власник | постгреси
Права доступу | postgres = UC / postgres
                  | = C / postgres
Опис | стандартна загальнодоступна схема

Без публічних привілеїв використання або створення

Назва | громадські
Власник | постгреси
Права доступу | postgres = UC / postgres
Опис | стандартна загальнодоступна схема

Дякую, це вирішено! (Я напишу записку у запитанні).
Емануеле Паоліні

3

У мене був файл pgdump зі створенням функцій у користувальницькій схемі, і я хотів переключити ім'я власної схеми на загальну публіку та замінив усі випадки старої схеми на порожні (наприклад, myschema.tablename to tablename) І почав отримувати помилку

ERROR:  no schema has been selected to create in

У моєму випадку помилка трапляється, коли на початку скидається даний рядок

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

Я змінив другий аргумент на "публічний"

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

І проблема пішла

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.