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


38

私はAmazon RDSのpostgresqlデータベースに取り組んでいますが、パブリックスキーマに何らかの問題があったことがわかっています(削除された可能性があります)。しかし、明らかにスキーマは存在し、とにかく問題は解決されません。次に、新しく作成された空のデータベースとのサンプルセッションを示します。

mydb=> CREATE TABLE distributors (
mydb(>     did     integer,
mydb(>     name    varchar(40) UNIQUE
mydb(> );
ERROR:  no schema has been selected to create in
mydb=> show search_path;
  search_path   
----------------
 "$user",public
(1 row)

mydb=> create schema public;
ERROR:  schema "public" already exists

ヒントはありますか?何を探すべきですか?

解決しました。 ダニエルヴェリテの回答のおかげで、私は次のように解決しました。

grant usage on schema public to public;
grant create on schema public to public;

これらはパブリックスキーマの既定のアクセス許可ですか?

私はデータベースにアクセスできる単一のユーザーを持っているので、これはとにかくセキュリティリスクを上げることはできないと思います...

template1にも同じ変更を加える必要があると思います。それが正しいか?template1のアクセス許可が正しいかどうか(たとえば、デフォルト値)を確認するにはどうすればよいですか?


3
たぶん、ユーザーはパブリックスキーマにテーブルを作成するために必要な権限を持っていないかもしれません。
a_horse_with_no_name

編集後:はい、template1に接続し、スキーマのアクセス許可を確認します(編集済みの回答を参照)。
ダニエルベリテ

回答:


34

これUSAGEは、のスキーマのいずれにも特権がない場合に発生しsearch_pathます。デフォルトでは、擬似ロールpublic(すべてのユーザー)はpublicスキーマに対するこの特権を持っているため、このエラーは明示的に以下を使用して取り消した後にのみ発生します。

revoke usage on schema public from public;

これは、他の人のスキーマを覗き込むのが望ましくない場合に必要です。テーブルからデータを選択しなくても(別の権限を通じて付与されます)。

これREVOKEがそのデータベースで実行されていない場合は、テンプレートデータベースで発生している可能性があり、テンプレートデータベースによって新しいデータベースがモデル化されます(を参照CREATE DATABASE)。


ユーザーにUSAGE権限はあるがCREATE、スキーマに対する権限がない場合、オブジェクトを作成しようとするときの別のエラー:スキーマpublicのアクセス許可が拒否されました

psql内の特権を確認するには、を使用します\dn+ public

デフォルトでは\x読みやすくするために拡張ディスプレイで表示):

#\ dn + public
スキーマのリスト
-[レコード1] ----- + -----------------------
名前| パブリック
オーナー| ポストグレス
アクセス権| postgres = UC / postgres
                  | = UC / postgres
説明| 標準公開スキーマ

以前の=ロール名の欠如は、それがすべてのロール(= public)であることを意味します

パブリックUSAGE特権なし

名前| パブリック
オーナー| ポストグレス
アクセス権| postgres = UC / postgres
                  | = C / postgres
説明| 標準公開スキーマ

パブリックUSAGEまたはCREATE特権なし

名前| パブリック
オーナー| ポストグレス
アクセス権| postgres = UC / postgres
説明| 標準公開スキーマ

おかげで、これは解決しました!(質問にメモを書きます)。
エマヌエーレパオリーニ

3

カスタムスキーマで関数を作成するpgdumpファイルがあり、カスタムスキーマ名を一般公開に切り替え、すべての出現を古いスキーマで空に置き換えたい(例:myschema.tablename to tablename)

ERROR:  no schema has been selected to create in

私の場合、ダンプの現在行の開始時にエラーが発生します

SELECT pg_catalog.set_config('search_path', '', false);

2番目の引数を「パブリック」に変更しました

SELECT pg_catalog.set_config('search_path', 'public', false);

そして問題はなくなった

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.