私はいくつかのテーブルをドロップしたかったので、誰かが以下を提案して、それをしました:
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*
エラーが発生したことがわかります
エラー:作成するスキーマが選択されていません*
パブリックスキーマを復元するにはどうすればよいですか?
「スキーマパブリックカスケードのドロップ」は絶対に行わないことをお勧めします。復元方法がわからない場合。誰か助けてくれますか?
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
を使用して、すべてのオブジェクトをすばやく破棄することをお勧めします。
アプリケーションユーザー(「postgres」など)があり、別のユーザーとしてDROP/CREATEコマンドを実行している場合、このアドバイスは問題を引き起こす可能性があります。これは、たとえば、「johndoe @ localhost」としてログインし、単にpsql mydatabaseにアクセスした場合に発生します。これを行うと、新しいスキーマの所有者は「postgres」ではなくjohndoeになり、アプリケーションが必要なテーブルを作成するときに、新しいスキーマが表示されなくなります。
アプリケーションのユーザーに所有権を戻すには(そのユーザーが「postgres」であると仮定して)、単に実行することができます(ローカルユーザーと同じpsqlプロンプトを作成します)。
ALTER SCHEMA public OWNER to postgres;
そして、あなたはすべて設定されます。