38

いくつかのテーブルを削除したかったので、誰かが以下を提案したので、それを実行しました:

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*

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

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

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

4

2 に答える 2

33

スキーマsearch_pathが見つからない場合、エラー メッセージが表示されます。
設定が間違っているかのどちらかです。これで何が得られますか?

SHOW search_path;

または、標準システム データベースpublicからスキーマを削除しました。実行時に間違ったデータベースに接続した可能性がありますtemplate1drop schema public cascade;

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

実行するだけです(スーパーユーザーとして、publicまたはmgojohnの回答を参照してください):

CREATE SCHEMA public;

データベースtemplate1(または必要な他のデータベース)で。

DROP SCHEMA ... CASCADEそれ以外の場合は、その中のすべてのオブジェクトをすばやく破棄するというアドバイスが有効です。

于 2013-01-11T20:46:49.380 に答える
24

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

アプリケーションのユーザー (ユーザーが「postgres」であると仮定) に所有権を戻すには、次のコマンドを実行するだけです (ローカル ユーザーと同じ psql プロンプトから):

ALTER SCHEMA public OWNER to postgres;

これで準備完了です。

于 2014-10-08T15:46:00.690 に答える