PostGres9.5を使用しています。作成したばかりのテーブルにデータを挿入できません。データベースユーザーにすべての権限を付与しているにもかかわらず、「権限が拒否されました」というエラーが発生します。下記参照 ...
localhost:myapp davea$ psql -Upostgres
Password for user postgres:
psql (9.5.0, server 9.5.1)
Type "help" for help.
postgres=# GRANT ALL ON schema public TO myapp;
GRANT
localhost:myapp davea$ psql -Upostgres
Password for user postgres:
psql (9.5.0, server 9.5.1)
Type "help" for help.
postgres=# GRANT USAGE ON schema public TO myapp;
GRANT
postgres=# \q
localhost:myapp davea$ myapp
psql (9.5.0, server 9.5.1)
Type "help" for help.
myapp=> insert into search_codes (id, code, address_id) values (1, 'atlanta', 'GA');
ERROR: permission denied for relation search_codes
myapp=> select * FROM search_codes;
ERROR: permission denied for relation search_codes
myapp=> \d search_codes;
Table "public.search_codes"
Column | Type | Modifiers
------------+-------------------+-----------------------------------------------------------
id | integer | not null default nextval('search_codes_id_seq'::regclass)
code | character varying |
address_id | character varying |
Indexes:
"search_codes_pkey" PRIMARY KEY, btree (id)
"index_search_codes_on_code" UNIQUE, btree (code)
"index_search_codes_on_address_id" btree (address_id)
ユーザーがテーブルから挿入して選択できるように特権を付与する適切な方法は何ですか?
最初のコマンドは、テーブルを一覧表示する機能を提供します(既存のものがあることを知ることができます)
GRANT USAGE ON SCHEMA public TO myapp
次に、スキーマパブリック内のすべてのテーブルにSELECT、INSERTなどを付与する必要があります
GRANT SELECT, UPDATE, INSERT, DELETE ON ALL TABLES IN SCHEMA public TO myapp
特定のアプリにすべての権限を付与しないことをお勧めします。
シーケンスがある場合:
GRANT SELECT, UPDATE, USAGE ON ALL SEQUENCES IN SCHEMA public to myapp
機能がある場合:
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public TO myapp
その後、あなたの例が機能します。
ただし、将来作成されるテーブルにアクセスできるようにする場合は、コマンドを適用する必要があります。
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, UPDATE, INSERT, DELETE, TRIGGER ON TABLES TO myapp
Postgresqlには非常に奇妙なメカニズムがあり、理解するのに時間がかかりました。
Myappデータベースではなくpostgresデータベースで権限を付与しています。
最初のPSQLコマンドをに変更します
psql -Upostgres myapp
そして、助成金を発行します
最初に、postgresユーザーを使用して新しいデータベースにログインする必要があります
psql your_db_name -U postgres -h your_Host_name
テーブルを一覧表示する機能を提供します
GRANT USAGE ON SCHEMA public TO your_user_name
次に、スキーマパブリック内のすべてのテーブルにアクセス許可を付与する必要があります
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO your_user_name
シーケンスがある場合は許可を与えます
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO your_user_name
https://dba.stackexchange.com/questions/33943/granting-access-to-all-tables-for-a-user をご覧ください。
あなたの問題は、GRANTがデータベース、スキーマ、およびテーブルで異なるため、テーブルにアクセス許可を明示的に設定する必要があることだと思います。