web-dev-qa-db-ja.com

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

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の権限が正しいかどうか(たとえば、デフォルト値)を確認するにはどうすればよいですか?

39

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

revoke usage on schema public from public;

これは、テーブルからデータを選択しなくても(別の特権で付与される)、他の人のスキーマを覗き見したくない場合に必要です。

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


ユーザーがUSAGE特権を持っているが、スキーマに対するCREATE特権がない場合、オブジェクトを作成しようとすると別のエラーになります:permission denied for schema public

Psql内の権限を確認するには、\dn+ publicを使用します。

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

#\ dn + public 
スキーマのリスト
-[RECORD 1] ----- + ----------------- ------ 
名前| public 
所有者| postgres 
アクセス権| postgres = UC/postgres 
 | = UC/postgres
説明|標準のパブリックスキーマ

=の前にロール名がないことは、すべてのロール(= public)のロール名であることを意味します

パブリックUSAGE特権なし

名前| public 
所有者| postgres 
アクセス権| postgres = UC/postgres 
 | = C/postgres
説明|標準のパブリックスキーマ

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

名前| public 
所有者| postgres 
アクセス権| postgres = UC/postgres 
説明|標準のパブリックスキーマ
34
Daniel Vérité

カスタムスキーマで関数を作成するpgdumpファイルがあり、カスタムスキーマ名を一般公開に切り替え、すべての出現箇所を古いスキーマで空に置き換えた(例:myschema.tablenameからtablename)と、エラーが発生し始めました

ERROR:  no schema has been selected to create in

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

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

2番目の引数を「public」に変更しました

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

そして問題はなくなった

6
Panoptik