Supabaseで「Permission defined to table hoge(42501)」が出たときの対処方法 + α
以下記事の内容を試してもSupabaseにアクセスできない場合の対処法
結論:これ
GRANT USAGE ON SCHEMA public TO anon;
GRANT USAGE ON SCHEMA public TO authenticated;
GRANT USAGE ON SCHEMA public TO service_role;
今の所、「Permission defined to table hoge」はprismaでDBのリセットした際に発生しております。
可能な限りリセットしないorテーブル作り直す方が早いです。が、データを残したい等あると思うのでその際に使うこと。
PostgreSQL で「テーブルに対する権限が足りずに permission denied が出る」ケースでは、
テーブルそのものへの権限以外にも、以下のようにスキーマやシーケンスへの権限が必要になる場合があります。
- データベースへの CONNECT 権限
- スキーマへの USAGE 権限
- テーブルへの操作権限
- (必要なら)シーケンスへの権限
例: 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";
注: テーブル
MstAdminUser
がpublic
スキーマにあるなら、このステップは不要です。
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
テーブルが SERIAL
や IDENTITY
カラムを使っており、
自動採番用の シーケンス(例: 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
」といったエラーを解決できるはずです。