エラー:読み取り専用ユーザーとしてSELECTを試行しているときにPostgresのリレーションテーブル名に対する権限が拒否されました


88
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;

読み取り専用ユーザーは接続してテーブルを表示できますが、単純な選択を行おうとすると、次のようになります。

ERROR: permission denied for relation mytable
SQL state: 42501

これはPostgreSQL 9.1で起こっています

何を間違えたか?


1
「リレーションmytable」について詳しく教えてください。スキーマ、それは「実際の」テーブル(またはビュー/関数)であり、トリガーします...
Igor Romanchenko

回答:


161

最近更新されたPostgreSQL 9以降の完全なソリューションを次に示します。

CREATE USER readonly  WITH ENCRYPTED PASSWORD 'readonly';
GRANT USAGE ON SCHEMA public to readonly;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO readonly;

-- repeat code below for each database:

GRANT CONNECT ON DATABASE foo to readonly;
\c foo
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO readonly; --- this grants privileges on new tables generated in new database "foo"
GRANT USAGE ON SCHEMA public to readonly; 
GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;

いくつかの重要な側面についてhttps://jamie.curle.io/creating-a-read-only-user-in-postgres/に感謝

誰かがより短いコードを見つけた場合、できればすべての既存のデータベースに対してこれを実行できるコードを見つけたら、追加の称賛が必要です。


6
これにはビューが含まれますか?
フランク・コンリー2014年

9
GRANT ALLデフォルトで読み取り専用ユーザーにアクセス許可を付与するのはなぜですか?
Slava Fomin II

1
私はそれが定義されたとおりに正確に与えましたが、それでもsamエラー
Anish Gopinath

を使用して付与された権限を確認できます\ddp。読み取り専用アクセスと同じ=r/ようgranting_user=r/readonly_userに表示されます。
Greg Bray、

これは質問の逐語的SQLです。それがどのようにソリューションを提供するのかわかりません。
r351574nc3

12

追加してみてください

GRANT USAGE ON SCHEMA public to readonly;

スキーマでオブジェクトを使用するために、スキーマへの必要なアクセス許可が必要であることをおそらくご存じではありませんでした。


何か奇妙なことが起こってpsqlpostgresます。ユーザーとして使用してサーバーでこれらのコマンドを実行すると、適切な応答が得られGRANTます。それでも、テーブルのACLを見ると、他に2つのアカウントしかありません。1つはデータベース所有者でjirauser、もう1つはという名前の読み取り専用アカウントqauserです。しかし、私readonlyはそこに現れません。Postgresはバージョン9.1で、サーバーを再起動しても、何も起こりません。
ソリン

2
psqlコンソールの\ duの出力は何ですか?あなたはまだこの出力を与えることができますか、それはあなたの答えのようにすでに修正されていますか?
sufleR

出力が正しかったので、何が起こったのか本当にわかりません(GRANT)。YEsterdayは機能しませんでしたが、今日は、3つのコマンドすべてを実行した後に機能しました。
ソリン

3
注:これに対する期待される応答は、単に「GRANT」です。「警告: "public"に権限が付与されていません」と表示された場合、機能しませんでした。ユーザーreadonlyは、自分自身に追加の権限を付与することはできません。「GRANT」権限を持つユーザーのみがこれを実行できるため、おそらくスーパーユーザーとしてログインする必要があります。
PeterVermont 2017年

こんにちは、私はスキーマのすべてのテーブルでSELECTをpostgresに付与しようとしています。応答:エラー:関係databasechangeloglockの権限が拒否されました。私が間違っていることを知っていますか?よろしくお願いいたします(GAppEngine Posgres9.6では、パブリックアドレスを使用し、ターミナルからアクセスします)
Mike

-5

これは私のために働きました:

次のコマンドを使用して、ログインしている現在の役割を確認します。SELECTCURRENT_USER、SESSION_USER;

:スキーマの所有者と一致する必要があります。

スキーマ| 名前| タイプ| 所有者
-------- + -------- + ------- + ----------

所有者が異なる場合は、次のようにして、管理者ロールから現在のユーザーロールにすべての権限を付与します。

「ROLE_OWNER」を「CURRENT ROLENAME」に付与します。

次に、クエリを実行してみます。これで、すべての関係にアクセスできるため、出力が得られます。


5
所有者をreadonlyと呼ばれるユーザーに変更することは、正しい修正のようには聞こえません。
アンナ

あなたのケースによっては、間違ったテーブル所有者が実際に原因である可能性があります(それは私に敵でした)。PostgreSQLでテーブルownershiipを変更する適切な方法:stackoverflow.com/a/13535184を
tanius

-6

ユーザーにその役割の属性があることを確認してください。例えば:

postgres=# \du
                             List of roles
 Role name |                   Attributes                   | Member of 
-----------+------------------------------------------------+-----------
 flux      |                                                | {}
 postgres  | Superuser, Create role, Create DB, Replication | {}

次のコマンドを実行した後:

postgres=# ALTER ROLE flux WITH Superuser;
ALTER ROLE
postgres=# \du
                             List of roles
 Role name |                   Attributes                   | Member of 
-----------+------------------------------------------------+-----------
 flux      | Superuser                                      | {}
postgres  | Superuser, Create role, Create DB, Replication | {}

それは問題を修正しました。

こちらのロールとスタッフのチュートリアルをご覧くださいhttps : //www.digitalocean.com/community/tutorials/how-to-use-roles-and-manage-grant-permissions-in-postgresql-on-a-vps--2


18
番号!「選択」を行うために「読み取り専用」と呼ばれるユーザーにスーパーユーザーの役割を与えることは、正しい修正ではありません。
アンナ

@アンナそれはここで起こっていることではありません。このスレッドは、読み取り専用アクセスを許可することを目的とするものではありません。このスレッドは、別のユーザーに読み取り専用アクセスを与えるためのユーザーアクセスを与えることについてです。私見、これは正しいです。ユーザーがスーパーユーザーでない場合、読み取り専用ユーザーを作成することはできません。発生しているエラーは、読み取り専用ユーザーを作成できることですERROR: permission denied for relation mytable
r351574nc3

-7

次のクエリを実行する必要があります。

GRANT ALL ON TABLE mytable TO myuser;

または、エラーがビューにある場合、おそらくテーブルに権限がないため、次のクエリを実行する必要があります。

GRANT ALL ON TABLE tbm_grupo TO myuser;

5
ユーザーは「読み取り専用」と呼ばれます。ユーザーにすべての権限を与えることが目標であることは疑わしいです。彼は選択をしたいだけです。
アンナ

これは、ALTER DROP DELETEEct を与える場合、ユーザーに「ReadOnly」という名前を付ける目的に反します。そのユーザーに...
JayRizzo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.