38

因为我想删除一些表格并且有人提出了以下建议,所以我做到了:

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*

你可以看到我有错误

错误:没有选择要创建的架构*

如何恢复公共架构?
我建议人们永远不要做“drop schema public cascade”;如果我们不知道如何恢复。有人可以帮帮我吗?

4

2 回答 2

33

search_path当您找不到任何架构时,会弹出错误消息。
要么是配置错误。你得到什么?

SHOW search_path;

或者您从标准系统数据库中删除了public模式。运行时可能连接到错误的数据库template1drop schema public cascade;

顾名思义,这是创建新数据库的模板。因此,每个新数据库public现在开始时都没有(默认)架构 - 而您的默认值search_path可能包含“公共”。

只需运行(以超级用户身份public或查看mgojohn 的答案):

CREATE SCHEMA public;

在数据库template1(或您需要的任何其他数据库)中。

DROP SCHEMA ... CASCADE快速销毁其中所有对象的建议是有效的。

于 2013-01-11T20:46:49.380 回答
24

如果您有一个应用程序用户(如“postgres”)并以其他用户身份运行 DROP/CREATE 命令,那么该建议可能会引起一些麻烦。例如,如果您以 'johndoe@localhost' 身份登录并简单地点击 psql mydatabase,就会发生这种情况。如果你这样做,新模式的所有者将是 johndoe,而不是“postgres”,当你的应用程序创建它需要的表时,它不会看到新模式。

要将所有权归还给应用程序的用户(假设用户是“postgres”),您可以简单地运行(形成与本地用户相同的 psql 提示符):

ALTER SCHEMA public OWNER to postgres;

你会准备好的。

于 2014-10-08T15:46:00.690 回答