"DROP SCHEMA public"之后无法创建新表

use*_*336 35 database postgresql create-table database-schema sql-drop

因为我想删除一些表,有人建议如下,我做了:

postgres=# drop schema public cascade;
DROP SCHEMA
postgres=# create schema public;
CREATE SCHEMA
Run Code Online (Sandbox Code Playgroud)

然后我在创建新数据库时遇到问题,例如:

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*
Run Code Online (Sandbox Code Playgroud)

你可以看到我收到了错误

错误:未选择任何架构来创建*

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

Erw*_*ter 29

当您search_path找不到任何模式时,会弹出错误消息.
它配置错误.你得到了什么?

SHOW search_path;
Run Code Online (Sandbox Code Playgroud)

或者您public标准系统数据库中template1删除了架构.您可能已经连接到错误的数据库,当你跑drop schema public cascade;

顾名思义,这是用于创建新数据库的模板.因此,现在每个新数据库都在没有(默认)架构的情况下启动public- 而您的默认值search_path可能在其中具有"公共".

刚运行(以超级用户身份public或参见mgojohn的回答):

CREATE SCHEMA public;
Run Code Online (Sandbox Code Playgroud)

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

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

  • @ user1342336:酷.:)只是要明确:`schema`是*in*a`database`,而不是相反.数据库集群 - >数据库 - >模式 - >表. (3认同)

mgo*_*ohn 23

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

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

ALTER SCHEMA public OWNER to postgres;
Run Code Online (Sandbox Code Playgroud)

你会全力以赴.