Skip to content

SnowFlake Permission Overview

Info

Author: Vincent, Published on 2021-06-06, Read time: about 6 minutes, WeChat official account article link:

1 Introduction

Properly managing permissions for objects (such as databases and tables) in a database is very important but often overlooked. When it comes to permission issues and problems, people will regret not taking permission management seriously. Therefore, this article will take the very popular SnowFlake data warehouse as an example, succinctly explaining important concepts and commonly used commands for permission management. It is recommended to like and bookmark for later review and use!

2 SnowFlake Permission Control Framework

SnowFlake has two permission control models:

  • Discretionary Access Control (DAC): Each object has an owner who can grant different permissions to others.
  • Role-based Access Control (RBAC): Access permissions are controlled by roles, which can be assigned to different users.

In SnowFlake, there are some important concepts that help understand permission control:

  • Securable object: An entity that can be granted specific permissions. If you do not have permission, access to the object will be denied.
  • Role: An entity that can receive permissions, which can be assigned to users or other roles to form different role hierarchies.
  • Privilege: The level of access control for objects. By setting different privileges, the granularity of access control can be controlled.
  • User: An identity that can be recognized by SnowFlake and can be a person or a program.

In SnowFlake, the permission control of securable objects is shown in the figure below. Access to securable objects can be granted by assigning permissions to roles, which means that permissions are assigned to other roles or objects. In addition, each securable object has an owner who can grant permissions to other roles.

SnowFlake Permission Control Diagram

3 Common Commands

After a basic understanding of how SnowFlake manages permissions, using commands to operate and view permissions will be more convenient.

3.1 Granting Permissions

GRANT {  { globalPrivileges         | ALL [ PRIVILEGES ] } ON ACCOUNT
       | { accountObjectPrivileges  | ALL [ PRIVILEGES ] } ON { USER | RESOURCE MONITOR | WAREHOUSE | DATABASE | INTEGRATION } <object_name>
       | { schemaPrivileges         | ALL [ PRIVILEGES ] } ON { SCHEMA <schema_name> | ALL SCHEMAS IN DATABASE <db_name> }
       | { schemaPrivileges         | ALL [ PRIVILEGES ] } ON { FUTURE SCHEMAS IN DATABASE <db_name> }
       | { schemaObjectPrivileges   | ALL [ PRIVILEGES ] } ON { <object_type> <object_name> | ALL <object_type_plural> IN { DATABASE <db_name> | SCHEMA <schema_name> } }
       | { schemaObjectPrivileges   | ALL [ PRIVILEGES ] } ON FUTURE <object_type_plural> IN { DATABASE <db_name> | SCHEMA <schema_name> }
      }
  TO [ ROLE ] <role_name> [ WITH GRANT OPTION ]

Where:

globalPrivileges ::=
  { { CREATE { ROLE | USER | WAREHOUSE | DATABASE | INTEGRATION } } | APPLY MASKING POLICY | APPLY ROW ACCESS POLICY | APPLY TAG | EXECUTE TASK | MANAGE GRANTS | MONITOR { EXECUTION | USAGE }  } [ , ... ]

accountObjectPrivileges ::=
-- For USER
  { MONITOR } [ , ... ]
-- For RESOURCE MONITOR
  { MODIFY | MONITOR } [ , ... ]
-- For WAREHOUSE
  { MODIFY | MONITOR | USAGE | OPERATE } [ , ... ]
-- For DATABASE
  { MODIFY | MONITOR | USAGE | CREATE SCHEMA | IMPORTED PRIVILEGES } [ , ... ]
-- For INTEGRATION
  { USAGE | USE_ANY_ROLE } [ , ... ]

schemaPrivileges ::=
    { MODIFY | MONITOR | USAGE | CREATE { TABLE | EXTERNAL TABLE | VIEW | MATERIALIZED VIEW | MASKING POLICY | ROW ACCESS POLICY | TAG | SEQUENCE | FUNCTION | PROCEDURE | FILE FORMAT | STAGE | PIPE | STREAM | TASK } } [ , ... ]

schemaObjectPrivileges ::=
    -- For TABLE
      { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES } [ , ... ]
    -- For VIEW
      { SELECT | REFERENCES } [ , ... ]
    -- For MATERIALIZED VIEW
        SELECT
    -- For SEQUENCE, FUNCTION (UDF or external function), PROCEDURE, or FILE FORMAT
        USAGE
    -- For internal STAGE
        READ [ , WRITE ]
    -- For external STAGE
        USAGE
    -- For PIPE
       { MONITOR | OPERATE } [ , ... ]
    -- For STREAM
        SELECT
    -- For TASK
       { MONITOR | OPERATE } [ , ... ]
    -- For MASKING POLICY
        APPLY
    -- For ROW ACCESS POLICY
        APPLY
    -- For TAG
        APPLY

The full list of all permissions can be found in SnowFlake's API documentation.

The required parameters are object_name, object_type, object_type_plural, and role_name, which are self-explanatory. Optional parameters include:

  • ON FUTURE: Specifies that the permission is granted to tables or views in a new database or schema, not existing objects.
  • WITH GRANT OPTION: Specifies whether the recipient role is allowed to grant permissions to other roles.

Examples are as follows:

# Specify that the role can continue to grant permissions with grant option
grant operate on warehouse report_wh to role analyst with grant option;

# Grant select permission on all tables in schema mydb.myschema to role analyst
grant select on all tables in schema mydb.myschema to role analyst;

3.2 Viewing Permissions

You can view object permissions using the SHOW GRANTS command, as shown below:

SHOW GRANTS ON ACCOUNT

SHOW GRANTS ON <object_type> <object_name>

SHOW GRANTS TO { ROLE <role_name> | USER <user_name> | SHARE <share_name> }

SHOW GRANTS OF ROLE <role_name>

SHOW GRANTS OF SHARE <share_name>

SHOW FUTURE GRANTS IN SCHEMA { <schema_name> }

SHOW FUTURE GRANTS IN DATABASE { <database_name> }

3.3 Revoking Permissions

The command to revoke permissions uses the REVOKE keyword:

``` REVOKE [ GRANT OPTION FOR ] { { globalPrivileges | ALL [ PRIVILEGES ] } ON ACCOUNT | { accountObjectPrivileges | ALL [ PRIVILEGES ] } ON { RESOURCE MONITOR | WAREHOUSE | DATABASE | INTEGRATION } | { schemaPrivileges | ALL [ PRIVILEGES ] } ON { SCHEMA | ALL SCHEMAS IN DATABASE } | { schemaPrivileges | ALL [ PRIVILEGES ] } ON { FUTURE SCHEMAS IN DATABASE } | { schemaObjectPrivileges | ALL [ PRIVILEGES ] } ON { | ALL IN SCHEMA } | { schemaObjectPrivileges | ALL [ PRIVILEGES ] } ON FUTURE IN { DATABASE | SCHEMA } } FROM [


Viewed times

Comments