“DROP SCHEMA public”之后无法创建新表

时间:2013-01-11 20:08:02

标签: database postgresql database-schema create-table sql-drop

因为我想放弃一些表格,有人建议如下,我做了:

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”;如果我们不知道如何恢复。有人可以帮助我吗?

2 个答案:

答案 0 :(得分:28)

如果找不到search_path中的任何模式,则会弹出错误消息 它配置错误。你得到了什么?

SHOW search_path;

或者您从standard system database template1删除了public架构。当您运行drop schema public cascade;

时,您可能已连接到错误的数据库

顾名思义,这是用于创建新数据库的模板。因此,每个新数据库都会在没有(默认)架构public的情况下启动 - 而您的默认search_path可能包含“公共”。

只需运行(以超级用户public或参见mgojohn's answer):

CREATE SCHEMA public;
数据库template1(或您需要的任何其他数据库)中的

使用DROP SCHEMA ... CASCADE来快速销毁其中所有对象的建议无效。

答案 1 :(得分:23)

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

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

ALTER SCHEMA public OWNER to postgres;

你会全力以赴。