web-dev-qa-db-ja.com

「DROP SCHEMA public」の後に新しいテーブルを作成できません

私はいくつかのテーブルをドロップしたかったので、誰かが以下を提案して、それをしました:

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*

エラーが発生したことがわかります

エラー:作成するスキーマが選択されていません*

パブリックスキーマを復元するにはどうすればよいですか?
「スキーマパブリックカスケードのドロップ」は絶対に行わないことをお勧めします。復元方法がわからない場合。誰か助けてくれますか?

35
user1342336

search_path 内のスキーマが見つからない場合、エラーメッセージがポップアップします。
いずれかが誤って設定されています。これで何が得られますか?

SHOW search_path;

または、 標準システムデータベースtemplate1 からpublicスキーマを削除しました。 drop schema public cascade;を実行したときにwrong databaseに接続した可能性があります

名前が示すように、これは新しいデータベースを作成するためのテンプレートです。したがって、すべての新しいデータベースは(デフォルトの)スキーマなしで開始しますpublic今-デフォルトのsearch_pathにはおそらく 'public'が含まれています。

単に実行します(スーパーユーザーpublicとして、または mgojohnの答え を参照):

CREATE SCHEMA public;

データベースtemplate1(または必要な他のデータベース)にあります。

それ以外の場合は、DROP SCHEMA ... CASCADEを使用して、すべてのオブジェクトをすばやく破棄することをお勧めします。

28

アプリケーションユーザー(「postgres」など)があり、別のユーザーとしてDROP/CREATEコマンドを実行している場合、このアドバイスは問題を引き起こす可能性があります。これは、たとえば、「johndoe @ localhost」としてログインし、単にpsql mydatabaseにアクセスした場合に発生します。これを行うと、新しいスキーマの所有者は「postgres」ではなくjohndoeになり、アプリケーションが必要なテーブルを作成するときに、新しいスキーマが表示されなくなります。

アプリケーションのユーザーに所有権を戻すには(そのユーザーが「postgres」であると仮定して)、単に実行することができます(ローカルユーザーと同じpsqlプロンプトを作成します)。

ALTER SCHEMA public OWNER to postgres;

そして、あなたはすべて設定されます。

23
mgojohn