Open4

Supabaseで「Permission defined to table hoge(42501)」が出たときの対処方法 + α

MAAAAAAAAAAAMAAAAAAAAAAA

結論:これ

GRANT USAGE ON SCHEMA public TO anon;
GRANT USAGE ON SCHEMA public TO authenticated;
GRANT USAGE ON SCHEMA public TO service_role;
MAAAAAAAAAAAMAAAAAAAAAAA

今の所、「Permission defined to table hoge」はprismaでDBのリセットした際に発生しております。
可能な限りリセットしないorテーブル作り直す方が早いです。が、データを残したい等あると思うのでその際に使うこと。

MAAAAAAAAAAAMAAAAAAAAAAA

PostgreSQL で「テーブルに対する権限が足りずに permission denied が出る」ケースでは、
テーブルそのものへの権限以外にも、以下のようにスキーマやシーケンスへの権限が必要になる場合があります。

  1. データベースへの CONNECT 権限
  2. スキーマへの USAGE 権限
  3. テーブルへの操作権限
  4. (必要なら)シーケンスへの権限

例: 4つの GRANT を行う場合

1. データベースへの CONNECT 権限

もし対象ユーザ(ロール)が、データベースへの接続権限をまだ持っていない場合は、下記のように付与します。

GRANT CONNECT ON DATABASE "your_database_name" TO "Authorization";
GRANT CONNECT ON DATABASE "your_database_name" TO "Anonimus";

: すでに CONNECT 権限が付与されているならこのステップは不要です。


2. スキーマへの USAGE 権限

テーブルが public スキーマ以外にある場合、スキーマへの USAGE 権限がないと
テーブルへアクセスできません(permission denied for schema XXX となる可能性あり)。

GRANT USAGE ON SCHEMA "your_schema_name" TO "Authorization";
GRANT USAGE ON SCHEMA "your_schema_name" TO "Anonimus";

: テーブル MstAdminUserpublic スキーマにあるなら、このステップは不要です。


3. テーブルへの操作権限

実際にテーブルを操作するための権限(SELECT, INSERT, UPDATE, DELETE, ...)を付与します。
全権限を与えたい場合は、ALL PRIVILEGES が手っ取り早いです。

GRANT ALL PRIVILEGES ON TABLE "your_schema_name"."MstAdminUser" TO "Authorization";
GRANT ALL PRIVILEGES ON TABLE "your_schema_name"."MstAdminUser" TO "Anonimus";

ALL PRIVILEGES の内訳は以下の 7 つです。(PostgreSQL 14 以降)

  • SELECT
  • INSERT
  • UPDATE
  • DELETE
  • TRUNCATE
  • REFERENCES
  • TRIGGER

4. シーケンスへの権限(必要な場合)

もし MstAdminUser テーブルが SERIALIDENTITY カラムを使っており、
自動採番用の シーケンス(例: MstAdminUser_id_seq)がある場合には、
INSERT などの操作のためにシーケンスへの権限も必要です。

GRANT USAGE, SELECT, UPDATE ON SEQUENCE "your_schema_name"."MstAdminUser_id_seq" TO "Authorization";
GRANT USAGE, SELECT, UPDATE ON SEQUENCE "your_schema_name"."MstAdminUser_id_seq" TO "Anonimus";
  • USAGE: シーケンスを使用できるようにする
  • SELECT: currval() 関数などで現在値を参照できるようにする
  • UPDATE: nextval() 関数でシーケンスを進められるようにする

まとめ

「テーブルに全権限を付与」するだけでなく、

  • データベースへの接続権限 (CONNECT)
  • スキーマへの使用権限 (USAGE)
  • シーケンスへの権限 (シリアル/IDENTITY カラムがある場合)

などが必要になるケースが多いため、最大で 4 種類の GRANT を行うことがあります。

もし「public スキーマにテーブルがある」「シーケンスを使っていない or すでに権限がある」等の場合は、
不要なステップは省いて問題ありません。

以下はフルセットの例です。(スキーマが public 以外で、シーケンスもある想定)

-- 1) データベースへのCONNECT権限
GRANT CONNECT ON DATABASE "your_database_name" TO "Authorization";
GRANT CONNECT ON DATABASE "your_database_name" TO "Anonimus";

-- 2) スキーマへのUSAGE権限
GRANT USAGE ON SCHEMA "your_schema_name" TO "Authorization";
GRANT USAGE ON SCHEMA "your_schema_name" TO "Anonimus";

-- 3) テーブルへの全権限付与
GRANT ALL PRIVILEGES ON TABLE "your_schema_name"."MstAdminUser" TO "Authorization";
GRANT ALL PRIVILEGES ON TABLE "your_schema_name"."MstAdminUser" TO "Anonimus";

-- 4) シーケンスへの権限付与(シリアル/IDENTITYカラム使用の場合)
GRANT USAGE, SELECT, UPDATE ON SEQUENCE "your_schema_name"."MstAdminUser_id_seq" TO "Authorization";
GRANT USAGE, SELECT, UPDATE ON SEQUENCE "your_schema_name"."MstAdminUser_id_seq" TO "Anonimus";

上記を実行すれば、データベース接続からテーブル操作、シーケンス操作まで対応できます。
これで「permission denied for table MstAdminUser」といったエラーを解決できるはずです。