Is my Supabase project affected?
Run one query. No rows means new tables get no grants.
The check
select
case d.defaclobjtype
when 'r' then 'tables'
when 'S' then 'sequences'
when 'f' then 'functions'
end as object_type,
a.grantee::regrole as role,
string_agg(a.privilege_type, ', ' order by a.privilege_type) as privileges
from pg_default_acl d
cross join lateral aclexplode(d.defaclacl) a
where d.defaclrole = 'postgres'::regrole
and d.defaclnamespace = 'public'::regnamespace
and a.grantee in ('anon'::regrole, 'authenticated'::regrole, 'service_role'::regrole)
group by 1, 2
order by 1, 2;
Run it in the SQL Editor. Each row lists a role and the privileges it receives on new tables, sequences or functions that the postgres role creates in public. When it returns no rows, new objects grant nothing to the Data API roles until you grant access.
What the old defaults were
| Object | Schema | Roles | Default privileges |
|---|---|---|---|
| Tables | public | anon, authenticated, service_role | select, insert, update, delete, truncate, references, trigger, maintain (Postgres 17 only) |
| Functions | public | anon, authenticated, service_role | execute |
| Sequences | public | anon, authenticated, service_role | usage, select, update |
What turning exposure off leaves behind
- New tables keep
truncate,references,triggerandmaintain; new sequences keepupdate. The Data API does not use these. - New functions stay callable by every role, because Postgres grants
executetoPUBLICthrough a global default.
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 the query on this page.
Write the fix for your tables
One table is free. The whole schema with a rollback file is $9 one-time.
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.
Parsed in your browser. Your SQL is never uploaded, and no site or database is scanned.
Questions
The query returns rows. Am I safe from 42501?
For now. It means new tables still receive those privileges. Supabase scheduled the default to change on every existing project on 2026-10-30, so run the check again after adding a table.
Sources
Related
- Postgres ACL decoderPaste the privilege string. Get one row per role, in words.
- Prisma tables return "permission denied for table"Prisma made the table, so the API roles were never granted. Here is the proof and the fix.
- Free migration template and grants auditTwo .sql files. One creates a table the right way. One shows what every table grants today.
- Go back to automatic exposureSupabase documents the SQL. Read what it re-opens before you run it.