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
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
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.
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.
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.
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.
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.
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.
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.