- Design around responsibilities
- Keep raw access narrow
- Use future grants carefully
- Use managed access schemas for governed publishing
- Separate build roles from consume roles
- Make sensitive access visible
- Final direction
Snowflake access design should do more than make queries work. It should explain ownership. A well-designed role model tells you who can load data, who can transform it, who can publish it, and who can consume it.
That is where least privilege becomes more than a security slogan. It becomes an operating model.
Design around responsibilities
Start with responsibilities, not individual users.
A simple production pattern might include:
RAW_LOADER_ROLE - can load source-shaped data
TRANSFORMER_ROLE - can read raw/staging and write curated tables
DATA_PRODUCT_OWNER - can manage published objects and grants
ANALYST_ROLE - can read approved serving objects
ADMIN_ROLE - can manage infrastructure and break-glass support
Users and service principals should receive roles that match the work they perform. Tables should not be granted directly to people as a default habit.
Keep raw access narrow
Raw schemas often contain sensitive, unstable, or source-shaped data. Give broad analyst access to curated serving layers, not raw landing layers.
GRANT USAGE ON DATABASE PLATFORM_DB TO ROLE ANALYST_ROLE;
GRANT USAGE ON SCHEMA PLATFORM_DB.MART TO ROLE ANALYST_ROLE;
GRANT SELECT ON ALL TABLES IN SCHEMA PLATFORM_DB.MART TO ROLE ANALYST_ROLE;
GRANT SELECT ON FUTURE TABLES IN SCHEMA PLATFORM_DB.MART TO ROLE ANALYST_ROLE;
That keeps the normal consumption path clean while allowing engineering roles to work deeper in the pipeline.
Use future grants carefully
Future grants are excellent for stable schemas where new objects should inherit access automatically. They are dangerous when a schema mixes private, experimental, and published objects.
Good use:
- analyst access to approved
MARTtables - transformer access to new staging tables
- monitoring role access to new operational logs
Risky use:
- broad access to raw schemas
- broad access to sandbox schemas
- future grants in schemas where sensitive objects are created before policy review
Use managed access schemas for governed publishing
Managed access schemas help centralize grant decisions. They are useful when a data product team owns what is published and wants grants to be controlled consistently.
CREATE SCHEMA IF NOT EXISTS PLATFORM_DB.CURATED
WITH MANAGED ACCESS;
In a managed access schema, object owners do not independently grant access. The schema owner or a role with MANAGE GRANTS controls grants, which is often cleaner for production data products.
Separate build roles from consume roles
One common mistake is letting the same role build and consume everything. That makes it hard to know whether a query worked because it used the approved interface or because the user had broad engineering access.
Prefer this split:
- build roles create and update pipeline objects
- consume roles read only published outputs
- owner roles manage release and access
- admin roles handle exceptional operations
This split supports better testing too. You can validate that an analyst role can use the published data product without accidentally relying on elevated privileges.
Make sensitive access visible
If a table contains protected columns, do not rely on naming alone. Use tags, masking policies, row access policies, and documentation together.
Examples of visible controls:
- tag
EMAILas restricted - apply a masking policy to
EMAIL - apply row access by region or business unit
- document the approved consumer roles
- review access history for sensitive objects
Final direction
Strong Snowflake access design is readable. A new engineer should be able to inspect roles and grants and understand the data product boundary. That is the brand signal: secure, practical, governed engineering that keeps delivery moving without making the platform loose and risky.