01Confirm the project and table
Compare the client URL, schema, table, filters, and environment with the dashboard you inspected.
What the result tells you: A development-versus-production mismatch can produce a valid empty result.
Appears when: SELECT returns []
An empty array often means the query succeeded but Row Level Security made every row invisible to the active role. Confirm the project and schema, then compare the session and SELECT policy against the rows you expect to see.
# Prove the target data existsCheck the exact project, schema, table, and representative row without exposing sensitive data.# State the intended visibility ruleDefine which users or tenants should see that row.# Correct the policy or ownership dataMake the narrow rule and stored ownership values agree.# Test visible and invisible casesVerify the owner can read the row and an unrelated user cannot.Preserve the current working revision, change one proven boundary, and verify the published path in a clean session.
Compare the client URL, schema, table, filters, and environment with the dashboard you inspected.
What the result tells you: A development-versus-production mismatch can produce a valid empty result.
Check whether the request is anonymous, authenticated, or server-side and whether the expected user id is present.
What the result tells you: A SELECT policy using auth.uid() will hide rows from an anonymous or different user.
Compare owner and tenant fields to the current claims.
What the result tells you: A policy can be syntactically valid while excluding every existing row.
| Likely cause | What proves it | First safe action |
|---|---|---|
| RLS filters every row | A development-versus-production mismatch can produce a valid empty result. | Prove the target data exists |
| Wrong project or environment | A SELECT policy using auth.uid() will hide rows from an anonymous or different user. | State the intended visibility rule |
| Filter value is different | A policy can be syntactically valid while excluding every existing row. | Correct the policy or ownership data |
| Session has not resolved | A development-versus-production mismatch can produce a valid empty result. | Test visible and invisible cases |
An empty array often means the query succeeded but Row Level Security made every row invisible to the active role. Confirm the project and schema, then compare the session and SELECT policy against the rows you expect to see.
No SELECT policy matches the active role and row ownership.
The app queries an empty production database while the dashboard shows development data.
Tenant, user, status, or date filters do not match stored values.
Freeze generated changes, restore the last known working version, reproduce one request, collect the browser and platform logs, and change one layer at a time.
RLS can validly return only rows the current role may see. If none match, an empty array is a successful result.
No. Dashboard or service-role access may be privileged. Test with the same role and claims as the browser.
Only if the data is intentionally public. Otherwise encode the actual ownership or tenant rule.
Free decision aid
Get a senior view of the constraint, the evidence you have, and the next decision that removes the most risk.
No email required for this decision aid. Dismiss once and this popup stays closed for the session.