MeWrite Docs

Supabase: Row Level Security policy violation

SupabaseのRLSポリシーによりアクセスが拒否された場合のエラー原因と解決策

概要

SupabaseのRow Level Security (RLS)ポリシーによりデータアクセスが拒否されるエラーです。

エラーメッセージ

``` new row violates row-level security policy for table “posts” ```

原因

  1. RLSポリシー未設定: テーブルにポリシーがない
  2. 認証情報の欠落: anon keyでアクセス
  3. ポリシー条件の不一致: WHERE句の条件を満たさない
  4. JWTの期限切れ: 認証トークンが無効

解決策

1. 基本的なRLSポリシーを作成

```sql – RLSを有効化 ALTER TABLE posts ENABLE ROW LEVEL SECURITY;

– SELECT ポリシー CREATE POLICY “Users can view own posts” ON posts FOR SELECT USING (auth.uid() = user_id);

– INSERT ポリシー CREATE POLICY “Users can create posts” ON posts FOR INSERT WITH CHECK (auth.uid() = user_id);

– UPDATE ポリシー CREATE POLICY “Users can update own posts” ON posts FOR UPDATE USING (auth.uid() = user_id);

– DELETE ポリシー CREATE POLICY “Users can delete own posts” ON posts FOR DELETE USING (auth.uid() = user_id); ```

2. 公開データ用ポリシー

```sql – 誰でも読める CREATE POLICY “Public posts are viewable” ON posts FOR SELECT USING (is_public = true); ```

3. 認証状態を確認

```javascript import { createClient } from ‘@supabase/supabase-js’;

const supabase = createClient(url, anonKey);

// ログイン状態を確認 const { data: { user } } = await supabase.auth.getUser(); console.log(user);

// セッションを確認 const { data: { session } } = await supabase.auth.getSession(); ```

4. Service Roleでバイパス(バックエンドのみ)

```javascript // サーバーサイドでのみ使用 const supabaseAdmin = createClient(url, serviceRoleKey);

// RLSをバイパスして操作 const { data } = await supabaseAdmin .from(‘posts’) .select(’*’); ```

よくある間違い

  • クライアントでservice_role_keyを使用
  • auth.uid()の代わりにユーザーIDをハードコード
  • RLS有効化後にポリシー作成を忘れる

関連エラー

関連エラー

Database の他のエラー

最終更新: 2025-12-11