Rowpass 42501: permission denied for table Not affiliated with Supabase

Rowpass / Guides

The Supabase change of 30 October 2026

New tables in public need explicit grants. Dates, scope and the SQL in one place.

Rollout dates

DateWhat happensWho it reaches
2026-04-28Changelog published. A setting at project creation lets you turn automatic exposure off.New projects that opt in
2026-05-30The new behavior becomes the default for all new projects (gradual rollout over a few weeks).New projects
2026-10-30The new behavior is enforced on all existing projects.Every project that uses the Data API

Notices Supabase said it would send

DateChannelAudience
2026-04-28Changelog postPublic
2026-05-07April monthly newsletterAll subscribers
2026-05-13Email: first notice of the May 30 changeOwners and admins of all active projects
2026-05-27Email: final reminder before May 30Owners and admins of all active projects
2026-09-23Email: five-week notice before October 30Owners and admins of all active projects
2026-10-23Email: final notice, one week beforeOwners and admins of all active projects

Dates are from the Supabase changelog post published 2026-04-28, read 2026-11-10. We have not seen an official post confirming that the 2026-10-30 step finished for every project, so check your own project with this query.

Who has to act

  • Your app reads or writes public tables through the Data API: PostgREST, GraphQL, supabase-js or direct HTTP to /rest/v1/.
  • Your migrations create tables in public without grant statements.
  • A coding tool, script or API call creates tables and expects them to be reachable at once.

You are not affected if you only use a direct Postgres connection.

What Supabase runs to switch a project over

alter default privileges for role postgres in schema public
  revoke select, insert, update, delete on tables from anon, authenticated, service_role;

alter default privileges for role postgres in schema public
  revoke usage, select on sequences from anon, authenticated, service_role;

These change defaults for future tables and sequences only. Existing objects keep their grants.

What each new table needs

-- public.your_table: owner only
alter table public.your_table enable row level security;
revoke all on table public.your_table from anon, authenticated;
grant select, insert, update, delete on table public.your_table to authenticated;
grant select, insert, update, delete on table public.your_table to service_role;
drop policy if exists your_table_select_own on public.your_table;
create policy your_table_select_own on public.your_table
  for select to authenticated
  using ( (select auth.uid()) = user_id );
drop policy if exists your_table_insert_own on public.your_table;
create policy your_table_insert_own on public.your_table
  for insert to authenticated
  with check ( (select auth.uid()) = user_id );
drop policy if exists your_table_update_own on public.your_table;
create policy your_table_update_own on public.your_table
  for update to authenticated
  using ( (select auth.uid()) = user_id )
  with check ( (select auth.uid()) = user_id );
drop policy if exists your_table_delete_own on public.your_table;
create policy your_table_delete_own on public.your_table
  for delete to authenticated
  using ( (select auth.uid()) = user_id );

Write the fix for your tables

One table is free. The whole schema with a rollback file is $9 one-time, free during launch.

 

Waiting for a paste.

    Who can reach each table

    Your tables show up here, one row each, with a choice of who can reach them.

    The SQL appears here as soon as a table is found.

    Parsed in your browser. Your SQL is never uploaded, and no site or database is scanned.

    Questions

    Did existing tables lose access on October 30?

    No. The changelog says existing tables keep their current grants and stay reachable. The first table you add afterwards is the one that fails.

    Can I go back to the old behavior?

    Supabase documents SQL that restores the old defaults. See restore automatic exposure and read the trade-off first.

    Sources

    Related

    Did it fix your error?