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

问题描述 投票:0回答:2

因为我想删除一些桌子,有人建议了以下内容,我就这么做了:

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*

你可以看到我有错误

错误:未选择在*中创建的模式

如何恢复公共架构?
我建议人们永远不要“删除模式公共级联;”如果我们不知道如何恢复。有人可以帮我吗?

database postgresql database-schema create-table sql-drop
2个回答
35
投票

当您的

search_path
中找不到任何模式时,会弹出错误消息。
search_path
配置错误。你能得到什么?

SHOW search_path;

或者您从

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

顾名思义,这是创建新数据库的默认模板。因此,现在每个新数据库开始时都没有默认模式

public
- 而您的默认
search_path
可能包含“public”。

只需以超级用户身份运行

postgres
(或参见mgojohn的答案):

CREATE SCHEMA public;

在数据库中

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

使用

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


25
投票

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

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

ALTER SCHEMA public OWNER to postgres;

一切都准备好了。

© www.soinside.com 2019 - 2024. All rights reserved.