🧱 Суть

RPC (Remote Procedure Call) – это способ вызвать функцию, которая выполняется на удалённой стороне.

В Supabase RPC позволяет вызывать PostgreSQL-функции из JavaScript-кода.

То есть вместо:

Клиент
   |

много запросов к таблицам
   |

обработка данных

можно сделать:

Клиент
   |

RPC-вызов
   |

SQL-функция в PostgreSQL
   |

готовый результат

📦 Зачем нужен RPC

RPC используют, когда логика:

  • сложная;
  • связана с несколькими таблицами;
  • должна выполняться внутри базы;
  • не должна находиться на клиенте.

Например:

  • поиск пользователя;
  • расчёт данных;
  • проверка прав;
  • агрегирование информации.

Проблема без RPC

Допустим, нужно найти email пользователя по имени.

Без RPC:

  1. Получить список пользователей:
supabase
  .from('users')
  .select('*')
  1. Найти нужного пользователя в JavaScript.
  2. Получить email.

Это:

  • лишние данные;
  • лишние запросы;
  • логика находится на клиенте.

✅ Решение через RPC

Создаётся функция в PostgreSQL:

CREATE OR REPLACE FUNCTION get_email_by_username(
  username_input text
)
RETURNS text
LANGUAGE sql
AS $$
  SELECT email
  FROM users
  WHERE username = username_input;
$$;

Теперь клиент вызывает её напрямую.

💻 Код

Вызов RPC из Supabase:

const { data, error } = await supabase.rpc(
  'get_email_by_username',
  {
    username_input: login
  }
);

Где:

get_email_by_username

– имя SQL-функции.

А:

{
  username_input: login
}

– параметры функции.

Как это работает

  1. JavaScript вызывает:
supabase.rpc(...)
  1. Supabase отправляет запрос в PostgreSQL.
  2. PostgreSQL запускает функцию.
  3. Функция возвращает результат.
  4. Supabase отдаёт результат обратно в приложение.

RPC и RLS

RPC тоже работает с системой безопасности Supabase.

Если функция выполняется от имени пользователя:

auth.uid()

будет доступен внутри неё.

Можно учитывать:

  • текущего пользователя;
  • его роль;
  • права доступа.

Пример проверки пользователя внутри функции

CREATE OR REPLACE FUNCTION get_my_profile()
RETURNS user_profiles
LANGUAGE sql
AS $$
  SELECT *
  FROM user_profiles
  WHERE id = auth.uid();
$$;

Теперь пользователь получает только свой профиль.

Важно

RPC не означает: “обойти безопасность и получить всё”.

Обычные правила доступа всё равно важны.

Особенно нужно учитывать:

  • RLS;
  • права функции;
  • SECURITY DEFINER / SECURITY INVOKER.

🎯 Вывод

  • RPC – это вызов SQL-функции из приложения.
  • Используется для сложной логики, которую лучше выполнять в базе.
  • Уменьшает количество запросов от клиента.
  • Позволяет держать бизнес-логику ближе к данным.
  • В Supabase вызывается через:
supabase.rpc()

🔗 Связано