1. ホーム
  2. postgresql

[解決済み] ERROR: Postgres で読み取り専用ユーザーとして SELECT を実行中に、リレーションの tablename に対してパーミッションが拒否されました。

2023-02-23 22:27:45

質問

GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;

リードオンリーユーザーは接続でき、テーブルを見ることができますが、単純なselectを行おうとすると

ERROR: permission denied for relation mytable
SQL state: 42501

この現象はPostgreSQL 9.1上で発生しています。

何がいけなかったのでしょうか?

どのように解決するのですか?

ここでは、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/ にはいくつかの重要な側面があります。

もし誰かがより短いコード、できればすべての既存のデータベースに対してこれを実行できるコードを見つけたら、さらに賞賛を送ります。