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の権限が正しいかどうか(たとえば、デフォルト値)を確認するにはどうすればよいですか?
これは、search_path
のどのスキーマに対してもUSAGE
特権がない場合に発生します。デフォルトでは、疑似ロールpublic
(すべてのユーザー)はpublic
schemaに対するこの特権を持っているため、このエラーは次のように明示的に取り消した後にのみ発生します。
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 説明|標準のパブリックスキーマ
カスタムスキーマで関数を作成する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);
そして問題はなくなった