関係の許可が拒否されました


330

私は簡単なsqlコマンドを実行しようとしました:

select * from site_adzone;

そして私はこのエラーを受け取りました

ERROR:  permission denied for relation site_adzone

ここで何が問題になるのでしょうか?

他のテーブルでも選択しようとすると、同じ問題が発生しました。私もこれをやろうとしました:

GRANT ALL PRIVILEGES ON DATABASE jerry to tom;

しかし、私はコンソールからこの応答を得ました

WARNING:  no privileges were granted for "jerry"

何が悪いのか考えていますか?


DBで読み取り/書き込みができるように権限を更新する方法がわかりません
Boban


2
SOへようこそ!この質問については、dba.stackexchange.comでさらに多くの助けを得るかもしれませんが、同じくらい多くのsnideコメントを見つけるかもしれません:)
Jared Beck

10
すみません。これは、今夜、話題から外れていると私が見た、プログラミング関連の2番目のpostgresql質問です!最後の1つは67,000ビューで、今回は30,000ビューでした。人気の条項があるはずです:15,000回以上のビューを持つ主観的でない質問=トピックについて。
セオドアR.スミス

1
この質問はトピックから外れていません!ただし、stackoverflow.com
questions / 13497352 /…の

回答:


391

データベースに対するGRANTは、必要なものではありません。テーブルに直接付与します。

データベースに対する権限の付与は、ほとんどの場合、接続権限を付与または取り消すために使用されます。これにより、他に十分な権限がある場合に、データベースで誰が何かを実行できるかを指定できます。

あなたが代わりにしたい:

 GRANT ALL PRIVILEGES ON TABLE side_adzone TO jerry;

これはこの問題を処理します。


7
postgresのように、スーパーユーザーとして実行します。
Chris Travers

19
これはどういうわけかショートカットになることができますか?すべてのテーブルですべての特権を付与しますか?
Shadur 14

196
@Shadurは、スキーマ内のすべてのテーブルのすべての特権をjerryに公開します。
Ron E

10
@RonEは現在のデータベースに制限されていますか?
Shadur 2014年

7
必要なスキーマの@zmiftah>スキーマnameSchemaのすべての特権をユーザーに付与します。
Pierozi

241

他のユーザーにとって役立つ可能性があるため、すべてのテーブルに対する権限の付与に対するRon E回答を投稿します。

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO jerry;

21
ALL SEQUENCESおよびに対しても同様のコマンドを実行する必要がある場合がありますALL FUNCTIONS
ピストス2017年

7
:ちょうど思っていた人のためにALL TABLESも、ビューが含まれているので全く別の存在しないALL VIEWSコマンドが:-)
アンドレ・ガッサー

74

まず適切なデータベースに接続してから、次を実行します。

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO jerry;

4
適切なデータベースへの接続に感謝しました。
ass '22

15
適切なデータベースに接続すると、大きな違いが生じます:)\connect databasename;
Denis Matafonov

3
この。私はずっと「postgres」とつながっていました。ありがとうございました!
Andrew G.

2
はい、DBに接続することで違いが生じました
イノスティア

44
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public to jerry;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public to jerry;
GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public to jerry;

このアンサーは私の日を救った!
anhtran

19

最初の重要なステップは、dbに接続することです。

psql -d yourDBName

2ステップ、特権の付与

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO userName;

18

スキーマ内の既存のすべてのテーブルにアクセス許可を付与するには、次のコマンドを使用します。

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA <schema> TO <role>

今後のテーブルに適用されるデフォルトの権限を指定するには、次を使用します。

ALTER DEFAULT PRIVILEGES IN SCHEMA <schema> 
  GRANT <privileges> ON TABLES TO <role>;

例えば

ALTER DEFAULT PRIVILEGES IN SCHEMA public 
  GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO admin;

SERIALまたはBIGSERIAL列を使用する場合は、おそらく同じようにを実行するSEQUENCES必要があります。そうしないINSERTと、失敗します(Postgres 10IDENTITYはその問題の影響を受けず、SERIALタイプよりも推奨されます)。つまり、

ALTER DEFAULT PRIVILEGES IN SCHEMA <schema> GRANT ALL ON SEQUENCES TO <role>;

詳細と再利用可能なスクリプトについては、Webアプリケーションに対するPostgreSQLの権限に対する私の回答も参照してください。

参照:

付与

デフォルトの特権の変更


9

これは、ユーザーpostgresとしてテーブルを作成し、通常のユーザーとしてアクセスしようとすると頻繁に発生します。この場合、postgresユーザーとしてログインし、次のコマンドを使用してテーブルの所有権を変更することをお勧めします。

alter table <TABLE> owner to <USER>;

5

テーブルの所有者としてpsqlにログインしていることを確認してください。テーブルの所有者を調べるには\dt

psql -h CONNECTION_STRING DBNAME -U OWNER_OF_THE_TABLES

その後、グラントを実行できます


0

選択権限を探しているので、すべての特権ではなく、選択のみを許可することをお勧めします。これは次の方法で実行できます。

GRANT SELECT ON <table> TO <role>;

0

あなたがすべき:

  1. postgresユーザーでDBeaverを使用してデータベースに接続する
  2. 左側のタブでデータベースを開きます
  3. 役割タブ/ドロップダウンを開く
  4. ユーザーを選択してください
  5. 右側のタブで[権限]タブを押します
  6. スキーマタブを押す
  7. プレステーブルタブ/ドロップダウン
  8. すべてのテーブルを選択
  9. 必要なすべての権限チェックボックスを選択します(または[すべて許可]を押します)
  10. 保存を押します

-3

一度この問題に直面しました。データベースユーザーをスーパーユーザーに変更するだけで、問題は解決します。

ALTER myuser myuser with SUPERUSER;


これにより、必要以上の権限が付与されます。スーパーユーザーは、など、他のユーザー、データベースを作成するようにあなたは、そのユーザが何をしたくない場合があります他の操作、それらに許可を与える
サンティ・
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.