В разрешении клиента 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 вам может потребоваться сбросить ее. Сброс базы данных приводит к удалению всей базы данных и ее воссозданию. Источник
Это очищает все
GRANT
s, которые необходимы для работы 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-м классе)
Запустите этот 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;