В разрешении клиента supabase отказано для общедоступной схемы

Всякий раз, когда я пытаюсь использовать @ supabase / supabase-js для запроса базы данных, я получаю сообщение об ошибке.

      error: {
    hint: null,
    details: null,
    code: '42501',
    message: 'permission denied for schema public'
}

Я думаю, это как-то связано с Prisma, которую я использую для миграции. Клиент работал нормально, когда я просто щелкал прототипом, но после настройки Prisma он больше не работает.

Есть предложения, как это исправить? Я действительно хотел бы иметь возможность использовать Supabase REST API и Prisma вместе.

7 ответов

Причина : когда вы выполняете prisma migrate reset или prisma migrate devв удаленной базе данных Supabase вам может потребоваться сбросить ее. Сброс базы данных приводит к удалению всей базы данных и ее воссозданию. Источник

Это очищает все GRANTs, которые необходимы для работы PostgREST. Вы можете найти ошибку в документации PostgREST по адресу:

https://postgrest.org/en/latest/tutorials/tut0.html?highlight=42501#step-5-run-postgrest

Решение 1. Создайте новый проект и используйте только prisma migrate deploy в удаленной базе данных.

Решение 2. Исправьте гранты вручную, предоставив доступ к таблицам

Вы можете проверить разницу, запустив следующий SQL-код для нового проекта Supabase и вашей поврежденной базы данных, чтобы увидеть различия.

      SELECT *
FROM information_schema.role_table_grants 
WHERE table_schema='public' and table_name='members'

Следующие гранты по умолчанию взяты из репозитория supabase github по адресу https://github.com/supabase/supabase/blob/a2fc6d592cb4ea50fd518b99db199a31912040b9/docker/volumes/db/init/00-initial-schema

      grant usage on schema public to postgres, anon, authenticated, service_role;
alter default privileges in schema public grant all on tables to postgres, anon, authenticated, service_role;
alter default privileges in schema public grant all on functions to postgres, anon, authenticated, service_role;
alter default privileges in schema public grant all on sequences to postgres, anon, authenticated, service_role;

alter default privileges for user supabase_admin in schema public grant all
    on sequences to postgres, anon, authenticated, service_role;
alter default privileges for user supabase_admin in schema public grant all
    on tables to postgres, anon, authenticated, service_role;
alter default privileges for user supabase_admin in schema public grant all
    on functions to postgres, anon, authenticated, service_role;

Вот список разрешений по умолчанию для образца таблицы members

Пожалуйста, не запускайте команду «Предоставить все привилегии» каждому типу возможного доступа пользователей к вашей базе данных.

Необходимый доступ зависит от того, что делает sql. Т.е. если нужно только выбрать и вставить, то предоставьте только эти привилегии, касающиеся предоставления всем доступа к усечению и удалению таблиц в вашей схеме...

У меня возникла проблема с использованием supabase.rpc() для запуска некоторых функций postgres. Эта функция будет выбирать некоторые данные из таблицы, обновлять таблицу, а затем вставлять в новую таблицу.

Первая ошибка, с которой я столкнулся, была

      {
 code: '42501',
  details: null,
  hint: null,
  message: 'permission denied for schema public'
}

Что было решено с помощью

      grant usage on schema "public" to anon;
grant usage on schema "public" to authenticated;

Это приводит к этой ошибке

         {
  code: '42501',
 details: null,
  hint: null,
  message: 'permission denied for table xxx'
 }

Что это было решено с помощью

      GRANT SELECT, INSERT, UPDATE ON ALL TABLES IN SCHEMA "public" TO authenticated;
GRANT SELECT, INSERT, UPDATE ON ALL TABLES IN SCHEMA "public" TO anon;

Некоторые источники см. ниже (потому что именно этому меня научили на уроках английского в 9-м классе)

Проблема с Github

Документы о грантах

Запустите этот SQL-скрипт в редакторе Supabase SQL.

источник: https://supabase.com/docs/guides/integrations/prisma#troubleshooting

      CREATE SCHEMA IF NOT EXISTS "auth";
CREATE SCHEMA IF NOT EXISTS "extensions";
create extension if not exists "uuid-ossp"      with schema extensions;
create extension if not exists pgcrypto         with schema extensions;
create extension if not exists pgjwt            with schema extensions;

grant usage on schema public to postgres, anon, authenticated, service_role;
grant usage on schema extensions to postgres, anon, authenticated, service_role;
alter user supabase_admin SET search_path TO public, extensions; -- don't include the "auth" schema

grant all privileges on all tables in schema public to postgres, anon, authenticated, service_role, supabase_admin;
grant all privileges on all functions in schema public to postgres, anon, authenticated, service_role, supabase_admin;
grant all privileges on all sequences in schema public to postgres, anon, authenticated, service_role, supabase_admin;

alter default privileges in schema public grant all on tables to postgres, anon, authenticated, service_role;
alter default privileges in schema public grant all on functions to postgres, anon, authenticated, service_role;
alter default privileges in schema public grant all on sequences to postgres, anon, authenticated, service_role;

alter default privileges for user supabase_admin in schema public grant all on sequences to postgres, anon, authenticated, service_role;
alter default privileges for user supabase_admin in schema public grant all on tables to postgres, anon, authenticated, service_role;
alter default privileges for user supabase_admin in schema public grant all on functions to postgres, anon, authenticated, service_role;

alter role anon set statement_timeout = '3s';
alter role authenticated set statement_timeout = '8s';

Ответ @kachar почти сработал для меня, ниже позвольте мне поделиться грантами SQL, которые сработали для меня сегодня

      grant usage on schema local to postgres, anon, authenticated, service_role;
alter user supabase_admin SET search_path TO public, local, extensions; -- add all schemas to search path but don't include the "auth" schema

grant all privileges on all tables in schema local to postgres, anon, authenticated, service_role, supabase_admin;
grant all privileges on all functions in schema local to postgres, anon, authenticated, service_role, supabase_admin;
grant all privileges on all sequences in schema local to postgres, anon, authenticated, service_role, supabase_admin;

alter default privileges in schema local grant all on tables to postgres, anon, authenticated, service_role;
alter default privileges in schema local grant all on functions to postgres, anon, authenticated, service_role;
alter default privileges in schema local grant all on sequences to postgres, anon, authenticated, service_role;

alter default privileges for user supabase_admin in schema local grant all
    on sequences to postgres, anon, authenticated, service_role;
alter default privileges for user supabase_admin in schema local grant all
    on tables to postgres, anon, authenticated, service_role;
alter default privileges for user supabase_admin in schema local grant all
    on functions to postgres, anon, authenticated, service_role;

Я ранее исказил свой проект Supabase, используя «чистую» функциональность Flyway (которая удаляет все элементы схемы, чтобы вы могли снова запустить свои миграции).

Вы можете увидеть его обсуждение здесь: https://github.com/supabase/supabase/discussions/344#discussioncomment-182886

Похоже, что в схеме проекта Supabase есть куча специфичных для Supabase конфигураций, и если вы запутаетесь с ней - произойдут странные вещи.

Возможно, вы захотите узнать, делает ли Prisma что-нибудь для схемы, о чем вы не подозревали.

Я столкнулся с той же проблемой, и я просто создал полностью новый проект на Supabase, а затем "npx prisma migrate dev" для повторного создания моих таблиц, и это работает как шарм! Я не знаю, когда я сломал свой проект Supabase. Если вы не можете повторно сгенерировать свои таблицы, потому что у вас есть данные, подумайте о переносе данных в новый проект, потому что это действительно работает!

Поскольку Supabase не предоставляет нам роль суперпользователя в онлайн-редакторе SQL, вы получите сообщение об ошибке при запуске sql из предыдущих ответов, например:

      ERROR:  42501: "supabase_admin" is a reserved role, only superusers can modify it

Поэтому вам нужно использовать этот SQL:

      grant all privileges on all tables in schema public to postgres, anon, authenticated, service_role;
grant all privileges on all functions in schema public to postgres, anon, authenticated, service_role;
grant all privileges on all sequences in schema public to postgres, anon, authenticated, service_role;

alter default privileges in schema public grant all on tables to postgres, anon, authenticated, service_role;
alter default privileges in schema public grant all on functions to postgres, anon, authenticated, service_role;
alter default privileges in schema public grant all on sequences to postgres, anon, authenticated, service_role;

grant usage on schema "public" to anon;
grant usage on schema "public" to authenticated;
Другие вопросы по тегам