How to Grant SELECT on a Table in Snowflake
Last updated July 25, 2026 · By the SaturnSQL team
GRANT SELECT ON TABLE ... TO ROLE gives read access, but the role also needs USAGE on the database and schema to reach the table. Future grants on the schema cover tables created later.
The full set of grants for read access
Snowflake privileges do not cascade downward, so a SELECT grant on the table is useless on its own. The role also needs USAGE on the database and on the schema in order to traverse to the object. This three-line pattern is the answer to almost every report of a grant existing but the table still not being visible.
GRANT USAGE ON DATABASE analytics TO ROLE analyst;
GRANT USAGE ON SCHEMA analytics.public TO ROLE analyst;
GRANT SELECT ON TABLE analytics.public.orders TO ROLE analyst;All current and future tables in a schema
ON ALL TABLES applies to what exists right now and does nothing for tables created afterwards. ON FUTURE TABLES covers the later ones but not the existing ones. You almost always want both, which is why they are run together here.
GRANT SELECT ON ALL TABLES IN SCHEMA analytics.public TO ROLE analyst;
GRANT SELECT ON FUTURE TABLES IN SCHEMA analytics.public TO ROLE analyst;Verify
SHOW GRANTS ON TABLE lists who can do what to that object, while SHOW GRANTS TO ROLE lists everything the role can reach. If access still fails after all of this, check that the user actually has the role granted and is using it, which SELECT CURRENT_ROLE() in their session settles quickly.
SHOW GRANTS ON TABLE analytics.public.orders;
SHOW GRANTS TO ROLE analyst;Run this in SaturnSQL
SaturnSQL is a browser-based SQL editor for teams: shared query library, schema-aware autocomplete, and scheduled exports to Google Sheets and Slack.
Try it free