因为我想放弃一些表格,有人建议如下,我做了:
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”;如果我们不知道如何恢复。有人可以帮助我吗?
答案 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;
你会全力以赴。