3.2 Core Workflows and Decision Points
Key Takeaways
- The default role hierarchy is ACCOUNTADMIN > (SECURITYADMIN + SYSADMIN); SECURITYADMIN inherits USERADMIN; every role ultimately rolls up to PUBLIC at the bottom.
- ORGADMIN manages organization-level tasks (creating accounts); ACCOUNTADMIN is the top account role and should be limited and protected with MFA.
- USERADMIN creates and manages users and roles; SECURITYADMIN manages grants globally; SYSADMIN creates databases, schemas, and warehouses.
- Future grants (GRANT ... ON FUTURE) automatically apply a privilege to objects created later in a schema or database.
- Role inheritance means a parent role automatically holds every privilege of the child roles granted to it; users switch roles with USE ROLE.
The System-Defined Role Hierarchy
Snowflake ships with six system-defined roles that cannot be dropped and have built-in privileges. The exam tests their responsibilities and their position in the hierarchy precisely.
| Role | Responsibility |
|---|---|
| ORGADMIN | Organization-level operations: create and manage accounts, view organization usage. Not in the account-role tree. |
| ACCOUNTADMIN | Top-level account role. Inherits SECURITYADMIN and SYSADMIN. Sees billing, all objects. Should be limited. |
| SECURITYADMIN | Manages grants globally (MANAGE GRANTS), monitors and manages users/roles. Inherits USERADMIN. |
| USERADMIN | CREATE USER and CREATE ROLE privileges; manages users and roles it owns. |
| SYSADMIN | Creates and manages databases, schemas, and warehouses. All custom roles should be granted to SYSADMIN. |
| PUBLIC | Automatically held by every user; default low-level role. Any object granted to PUBLIC is visible to everyone. |
The default inheritance is: ACCOUNTADMIN sits above both SYSADMIN and SECURITYADMIN; SECURITYADMIN sits above USERADMIN; and everything rolls up from PUBLIC at the bottom. ACCOUNTADMIN therefore inherits all privileges below it.
Role Inheritance and Custom Roles
Role inheritance means that if role A is granted to role B, then B automatically holds every privilege of A. This is how privileges aggregate. Snowflake's recommended pattern is to build custom roles for business functions (e.g., ANALYST, DATA_ENGINEER), grant object privileges to those custom roles, and then grant the custom roles to SYSADMIN. That way SYSADMIN — and therefore ACCOUNTADMIN — can manage everything, while end users hold only the narrow custom role they need.
Switching and activating roles
A user can be granted many roles but uses one primary (current) role at a time, activated with USE ROLE my_role. Secondary roles can be activated with USE SECONDARY ROLES ALL, letting a session combine privileges across roles. The role that creates an object becomes its owner and holds OWNERSHIP, which can be transferred with GRANT OWNERSHIP.
Standard grant workflow
To give an analyst read access to a schema's tables:
USE ROLE USERADMIN;thenCREATE ROLE ANALYST;USE ROLE SECURITYADMIN;thenGRANT USAGE ON DATABASE sales TO ROLE ANALYST;andGRANT USAGE ON SCHEMA sales.public TO ROLE ANALYST;GRANT SELECT ON ALL TABLES IN SCHEMA sales.public TO ROLE ANALYST;GRANT ROLE ANALYST TO USER jdoe;andGRANT ROLE ANALYST TO ROLE SYSADMIN;
Future Grants and Decision Points
GRANT SELECT ON ALL TABLES IN SCHEMA ... covers tables that exist now. To automatically cover tables created later, you need a future grant:
GRANT SELECT ON FUTURE TABLES IN SCHEMA sales.public TO ROLE ANALYST;
Future grants are a high-frequency exam topic. Remember: a future grant defined at the schema level takes precedence over one defined at the database level for objects in that schema, and ALL + FUTURE together cover both existing and new objects.
Which role for which task — the decision table
| Task | Correct role |
|---|---|
| Create a new account in the organization | ORGADMIN |
| Create a database or warehouse | SYSADMIN |
| Create a user or a role | USERADMIN |
| Grant a role to a user across the account | SECURITYADMIN (has MANAGE GRANTS) |
| View account billing / set a resource monitor at account level | ACCOUNTADMIN |
ACCOUNTADMIN discipline
Because ACCOUNTADMIN can see billing and every object and can bypass many controls, Snowflake recommends: grant it to as few users as possible (at least two for redundancy), require multi-factor authentication for those users, and avoid using it as a default role for routine work. Many exam stems reward choosing the least-privileged role that still completes the task rather than reaching for ACCOUNTADMIN.
Revoking, Inspecting, and Common Workflow Traps
Grants are reversed with REVOKE. Revoking a privilege from a role removes it from every user and child role that inherited it, which can have a wider blast radius than expected. To inspect the current state, use the metadata commands: SHOW GRANTS TO ROLE analyst (privileges a role holds), SHOW GRANTS TO USER jdoe (roles a user has), and SHOW GRANTS ON TABLE customers (everyone who can touch an object). These commands are themselves test material — know which one answers "who can read this table?" (SHOW GRANTS ON ...) versus "what can this role do?" (SHOW GRANTS TO ROLE ...).
The default-role nuance
Each user has a default role (DEFAULT_ROLE) that activates at login, but a user can USE ROLE to switch to any role granted to them. A user who "cannot see" an object often simply has the wrong current role active — not a missing grant. The fix is USE ROLE, not a new GRANT. Stems frequently bury this distinction.
Workflow checklist
| Goal | Command sequence |
|---|---|
| New read role | CREATE ROLE > GRANT USAGE (db, schema) > GRANT SELECT > GRANT ROLE to user and to SYSADMIN |
| Cover future objects | GRANT ... ON FUTURE ... |
| Hand off an object | GRANT OWNERSHIP ... COPY CURRENT GRANTS |
| Audit access | SHOW GRANTS ON / TO ROLE / TO USER |
Working this checklist mechanically prevents the two most common mistakes: forgetting the USAGE chain, and forgetting to grant the new custom role up to SYSADMIN so administrators retain control.
Which system-defined role has the CREATE USER and CREATE ROLE privileges by default?
An administrator wants a role to automatically have SELECT on any table created in a schema in the future. Which grant accomplishes this?
Following Snowflake's recommended RBAC pattern, custom roles should ultimately be granted to which system role so administrators can manage them?
Why should ACCOUNTADMIN be granted to only a small number of users and protected with MFA?