Open1

Supabase RLS Disable

JboyHashimotoJboyHashimoto

test tableを🉑

はい、SQLクエリでスキーマのパーミッション設定ができます。これはスキーマレベルのアクセス権限の問題ですので、以下のSQLで解決できます。

-- publicスキーマへのアクセス権限を付与
GRANT USAGE ON SCHEMA public TO anon, authenticated;

-- 既存のテーブルへの権限を付与
GRANT ALL ON ALL TABLES IN SCHEMA public TO anon, authenticated;

-- 今後作成されるテーブルへのデフォルト権限を設定
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT ALL ON TABLES TO anon, authenticated;

-- シーケンスへの権限を付与(必要な場合)
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO anon, authenticated;

-- RLSを無効化(テスト用)
ALTER TABLE test DISABLE ROW LEVEL SECURITY;

-- 権限の確認クエリ
SELECT 
    schemaname, 
    tablename, 
    tableowner, 
    rowsecurity 
FROM pg_tables 
WHERE schemaname = 'public';

これらのSQLは以下の手順で実行できます:

  1. Supabaseダッシュボード → SQL Editor を開く
  2. New Query をクリック
  3. 上記のSQLをコピー&ペースト
  4. RUN をクリック

パーミッションを確認するための追加のクエリ:

-- スキーマの権限を確認
SELECT 
    grantor, 
    grantee, 
    privilege_type 
FROM information_schema.role_usage_grants 
WHERE object_name = 'public';

-- テーブルの権限を確認
SELECT 
    table_name,
    grantee, 
    privilege_type 
FROM information_schema.role_table_grants 
WHERE table_schema = 'public';

-- ロールの確認
SELECT 
    r.rolname, 
    r.rolsuper, 
    r.rolinherit,
    r.rolcreaterole,
    r.rolcreatedb,
    r.rolcanlogin,
    r.rolreplication,
    r.rolconnlimit,
    r.rolvaliduntil
FROM pg_catalog.pg_roles r
ORDER BY 1;

また、Remixのコードでデバッグ情報を追加して、より詳細なエラー情報を確認できるようにしましょう:

import { useLoaderData } from "@remix-run/react";
import { json } from "@remix-run/node";
import { createClient } from "@supabase/supabase-js";

export const loader = async () => {
  const supabaseUrl = process.env.VITE_SUPABASE_URL;
  const supabaseAnonKey = process.env.VITE_SUPABASE_ANON_KEY;

  console.log('Environment variables:', {
    url: supabaseUrl?.substring(0, 10) + '...',
    key: supabaseAnonKey?.substring(0, 5) + '...'
  });

  if (!supabaseUrl || !supabaseAnonKey) {
    throw new Error('Missing Supabase environment variables');
  }

  const supabase = createClient(supabaseUrl, supabaseAnonKey, {
    db: {
      schema: 'public'
    },
    auth: {
      persistSession: false,
      autoRefreshToken: true
    }
  });

  try {
    // スキーマ情報の取得を試みる
    const { data: schemaInfo, error: schemaError } = await supabase
      .rpc('get_schema_info', {
        schema_name: 'public'
      })
      .single();

    console.log('Schema info:', { schemaInfo, schemaError });

    // メインのクエリ
    const { data, error } = await supabase
      .from('test')
      .select('*');

    console.log('Query attempt:', {
      success: !error,
      error: error ? {
        code: error.code,
        message: error.message,
        details: error.details
      } : null
    });

    if (error) {
      return json({
        error: {
          type: 'query_error',
          details: error
        }
      }, { 
        status: 500 
      });
    }

    return json({ data });
  } catch (error) {
    console.error('Unexpected error:', error);
    return json({ 
      error: {
        type: 'unexpected_error',
        message: error instanceof Error ? error.message : 'Unknown error'
      }
    }, { 
      status: 500 
    });
  }
};

エラーが続く場合の追加のトラブルシューティング手順:

  1. Supabaseダッシュボードで権限を確認:
Authentication → Policies → Show system policies
  1. テーブルのオーナーを確認:
SELECT tablename, tableowner 
FROM pg_tables 
WHERE schemaname = 'public';
  1. 特定のテーブルに対する権限を直接付与:
GRANT ALL PRIVILEGES ON TABLE test TO anon, authenticated;
  1. スキーマの所有者を確認:
SELECT n.nspname as "Schema",
       r.rolname as "Owner"
FROM pg_catalog.pg_namespace n
  JOIN pg_catalog.pg_roles r ON r.oid = n.nspowner
WHERE n.nspname = 'public';

これらの設定を適用しても問題が解決しない場合は、Supabaseのダッシュボードで以下も確認してください:

  1. Project Settings → Database
  2. Project Settings → API
  3. Authentication → Policies

具体的なエラーメッセージや状況の変化があれば、お知らせください。