【问题标题】:Cannot create a new table after "DROP SCHEMA public"“DROP SCHEMA public”后无法创建新表
【发布时间】:2012-12-26 11:44:23
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    当您的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 快速销毁其中所有对象的建议是有效的。

    【讨论】:

    • 超级!太感谢了!是的,在我运行“CREATE SCHEMA public;”之后在 template1 中,我可以在公共架构中创建新数据库。
    • @user1342336:酷。 :) 明确一点:schemain database,而不是相反。数据库集群 -> 数据库 -> 架构 -> 表。
    • 太棒了!非常感谢您为我澄清这一点!
    【解决方案2】:

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

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

    ALTER SCHEMA public OWNER to postgres;
    

    你会准备好的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-06
      • 2016-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-12
      • 2016-04-02
      相关资源
      最近更新 更多