Nie można utworzyć nowej tabeli po "upuść schemat publiczny"

Ponieważ chciałem rzucić kilka tabel i ktoś zasugerował poniżej I zrobiłem to:

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

Potem mam problem przy tworzeniu nowej bazy danych, np:

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*

Widać, że mam błąd

Błąd: nie wybrano schematu do utworzenia w*

Jak mogę przywrócić publiczny schemat?
Proponuję ludzie nigdy nie "drop schema public cascade;" jeśli nie wiemy, jak przywrócić. Czy ktoś może mi pomóc?

Author: Erwin Brandstetter, 2013-01-12

2 answers

Komunikat o błędzie pojawia się, gdy żaden ze schematów w Twoim search_path można znaleźć.
Albo jest źle skonfigurowany. Co za to dostajesz?

SHOW search_path;

Lub usunąłeś public schemat ze swojego standardowa baza danych systemu template1. Możesz być podłączony do złej bazy danych kiedy uruchomiłeś drop schema public cascade;

Jak sama nazwa wskazuje, jest to szablon do tworzenia nowych baz danych. Dlatego każda nowa baza danych zaczyna się bez (default) schema public now - podczas gdy Twoja domyślna search_path prawdopodobnie ma w sobie' public'.

Po prostu uruchom (jako superuser public lub zobacz odpowiedź mgojohna):

CREATE SCHEMA public;

W bazie danych template1 (lub w dowolnym innym db tam, gdzie go potrzebujesz).

Rada z DROP SCHEMA ... CASCADE, aby zniszczyć wszystkie obiekty w nim szybko jest inaczej ważne.

 26
Author: Erwin Brandstetter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:09:17

Ta porada może powodować pewne problemy, jeśli masz użytkownika aplikacji (jak 'postgres') i uruchamiasz polecenia DROP/CREATE jako inny użytkownik. Stanie się tak, jeśli na przykład zalogujesz się jako' johndoe@localhost ' i po prostu naciśniesz psql mydatabase. Jeśli to zrobisz, właścicielem nowego schematu będzie johndoe, a nie 'postgres', a gdy aplikacja pojawi się, aby utworzyć tabele, których potrzebuje, nie zobaczy nowego schematu.

Oddać własność użytkownikowi aplikacji (zakładając, że użytkownik jest 'postgres'), możesz po prostu uruchomić (z tego samego monitu psql co twój użytkownik lokalny):

ALTER SCHEMA public OWNER to postgres;
I wszystko będzie gotowe.
 23
Author: mgojohn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-08 15:46:00