Início / RLS / Erro PGRST202: Could not find the function · Read in English

Supabase · Correção de erro

Erro PGRST202: Could not find the function in the schema cache

Postgres 15 · Supabase✓ código testado num banco de verdade
TL;DR

A Data API procura a função pelo nome e pelos nomes dos argumentos que você manda. Se você chama rpc('get_orders', { userId }) e o parâmetro da função é p_user_id, ela não é encontrada. Mande os nomes exatos dos parâmetros, mantenha a função num schema exposto e recarregue o cache depois de criá-la.

01 Leia a mensagem

resposta

{
  "code": "PGRST202",
  "message": "Could not find the function public.get_orders(userId) in the schema cache"
}

Os parênteses listam os nomes dos argumentos que o seu cliente mandou, não os da função. Compare com a definição: essa diferença é a causa mais comum. O status HTTP é 404.

02 As causas

CAUSA 1 · mais comum

Os nomes dos argumentos não batem

Os argumentos da RPC são casados pelo nome. A função abaixo precisa ser chamada com p_user_id, não userId nem user_id.

CAUSA 2

A função não está num schema exposto

Só os schemas listados nas configurações da Data API são servidos. Uma função em private fica invisível pro rpc(), o que normalmente é o que você quer pra funções auxiliares.

CAUSA 3

Cache desatualizado

A função acabou de ser criada ou mudou de assinatura.

função e chamada

create function public.get_orders(p_user_id uuid)
returns setof orders language sql stable as $$
  select * from public.orders where user_id = p_user_id
$$;

-- cliente: a chave tem que ser o nome do parâmetro
-- await supabase.rpc('get_orders', { p_user_id: user.id })

notify pgrst, 'reload schema';   -- depois de criar ou alterar

03 O próximo erro: permissão

Depois de encontrada, o role de quem chama precisa de execute, senão o erro vira 42501 permission denied for function get_orders. Dê permissão só pros roles que devem chamar:

revoke execute on function public.get_orders(uuid) from public, anon;
grant execute on function public.get_orders(uuid) to authenticated;

Funções novas podem ser executadas por todo mundo por padrão (o Postgres dá execute pra public), então revogue primeiro se a função não deve ser pública. Uma função security definer ignora o RLS: veja como listar as que anon consegue chamar.

04 Duas funções com o mesmo nome

Sobrecargas que só mudam o tipo dão outro erro, PGRST203 Could not choose the best candidate function. Renomeie uma ou dê nomes diferentes aos parâmetros.

◆ GRÁTIS · 30 SEGUNDOS · SEM CADASTRO

Seu app está vazando agora?

Cole a URL do seu app no ar. O scanner lê a página e o JavaScript atrás de uma chave service_role do Supabase, o vazamento que passa por cima de todas as policies deste guia.

◆ GRÁTIS · MIT · npm + GitHub Action

Pegue isso antes de ir pro ar

airlock-rls é um gate de CI que quebra o build quando uma tabela vai pro ar exposta ou uma policy é permissiva: o mesmo tipo de bug, pego no CI contra um banco com as suas migrations aplicadas, antes de chegar em produção.

npx airlock-rls→

Ou comece pelo nextjs-supabase-starter: auth + uma tabela com RLS + um teste de isolamento, pra começar de um padrão que já vem selado.

PDF GRÁTIS

Baixe o cheat sheet de RLS do Supabase

As regras de ouro, as armadilhas que vazam em produção, policies corretas e o teste de isolamento, numa página só (em inglês).

FAQ

Funciona no SQL editor. Por que não pelo rpc()?

O SQL editor chama a função direto, com argumentos por posição ou nome, e como um role privilegiado. O rpc() passa pela Data API, que casa os argumentos pelo nome, só enxerga schemas expostos e roda como anon ou authenticated.

A ordem dos argumentos importa?

Não. A Data API casa os argumentos pelo nome, então a ordem não importa, mas cada nome precisa existir na lista de parâmetros da função.