Невозможно создать новую таблицу после публикации "DROP SCHEMA public"

Так как я хотел сбросить некоторые таблицы, и кто-то предложил ниже, и я сделал это:

postgres=# drop schema public cascade;
DROP SCHEMA
postgres=# create schema public;
CREATE SCHEMA

Тогда возникает проблема при создании новой базы данных, например:

postgres=# create database test;
CREATE DATABASE
postgres=# \c test
You are now connected to database "test" as user "postgres".
test=# create table hi(id int primary key);
*ERROR:  no schema has been selected to create in*

Вы можете видеть, что я получил ошибку

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

Как восстановить общедоступную схему? Я предлагаю, чтобы люди никогда не делали "публичный каскад схемы схемы"; если мы не знаем, как восстановить. Может кто-нибудь помочь мне?

Ответ 1

Сообщение об ошибке появляется, когда ни одна из схем в вашем search_path может быть найдена.
Либо это неправильно настроено. Что вы получаете за это?

SHOW search_path;

Или вы удалили public схему из вашей стандартной системной базы данных template1. Возможно, вы подключены к неверной базе данных, когда вы запустили drop schema public cascade;

Как следует из названия, это шаблон для создания новых баз данных. Следовательно, каждая новая база данных начинается без (по умолчанию) public схемы - в то время как в вашем search_path умолчанию, вероятно, есть public.

Просто запустите (как привилегированной public или увидеть mgojohn ответ):

CREATE SCHEMA public;

в базе данных template1 (или любой другой базе данных, где она вам нужна).

В противном случае действителен совет с DROP SCHEMA... CASCADE по быстрому уничтожению всех объектов в нем.

Ответ 2

Этот совет может вызвать некоторые проблемы, если у вас есть пользователь приложения (например, postgres) и запуск команд DROP/CREATE как другого пользователя. Это произойдет, если, например, вы вошли в систему как "johndoe @localhost" и просто нажмите psql mydatabase. Если вы это сделаете, новый владелец схемы будет johndoe, а не postgres, и когда ваше приложение приступит к созданию необходимых ему таблиц, оно не увидит новую схему.

Чтобы вернуть владельца вашему приложению (при условии, что пользователь "postgres" ), вы можете просто запустить (сформировать ту же самую подсказку psql, что и ваш локальный пользователь):

ALTER SCHEMA public OWNER to postgres;

и все будет установлено.