Supabase permission denied for schema public: the GRANT agents forget after creating roles
A new role or a fresh table, and queries fail with permission denied for schema public. Creating the table is not enough: the role needs USAGE on the schema plus grants on the tables, and RLS policies on top.
"permission denied for schema public": grants, not policies
Agents confuse this with RLS because both produce permission errors. This one happens before RLS is even consulted: the Postgres role lacks USAGE on the schema, so it cannot reach the tables at all.
Symptom to cause to confirmation to fix
- Confirm the exact error mentions the schema, not a table or a policy. "permission denied for schema public" is a grant problem. "new row violates row-level security policy" is an RLS problem. Different fixes.
- Grant usage:
grant usage on schema public to your_role;. Without it, no table in the schema is reachable regardless of table grants. - Grant the table privileges the role needs:
grant select, insert, update, delete on your_table to your_role;, orgrant all on all tables in schema publicfor a trusted internal role. Grants are per table; new tables need new grants. - Then check RLS. Grants get the role to the table; RLS policies decide which rows. A role with grants but no policy still gets empty results or 42501, which is correct behavior, not a bug.
- For the Supabase-managed
anonandauthenticatedroles, prefer policies over direct grants, and do not revoke the default grants the platform relies on.
Verification
Connect as the role and run the intended queries. Success here plus correct RLS filtering means both layers are right. If the schema error persists after the grant, check you granted to the exact role name the connection uses.
Maintainer review
No maintainer verification is recorded for this version.
This records the version a maintainer checked. It does not assert that the version is the latest upstream release.