Snowflake 会话和会话策略

本主题介绍 Snowflake 会话和会话策略,并提供在账户或用户级别配置会话策略的说明。

Snowflake 会话

当用户连接到 Snowflake 并使用 Snowflake 编程客户端、Snowsight 或 Classic Console 成功进行身份验证时,会话开始。会话独立于身份提供商(即 IdP)会话。如果 Snowflake 会话过期但 IdP 会话保持活动状态,用户无需再次输入登录凭据即可登录 Snowflake(即静默身份验证)。

会话随着用户的持续活动而无限期地维持。会话长时间不处于活动状态(空闲会话超时)后,用户必须再次向 Snowflake 进行身份验证。空闲会话超时的最大值为四小时,会话策略可以修改空闲会话超时时间。空闲会话超时适用于以下情况:

Snowflake 建议尽可能重用现有会话,并在不再需要会话时关闭与 Snowflake 的连接。

Snowsight 会话

Snowflake 为 Snowsight 中的每个工作表创建一个新会话。工作表会话强制执行适用于创建工作表的用户的会话策略。

小心

当会话结束且用户注销时,处于活动状态的查询 不会 取消,即使 ABORT_DETACHED_QUERY 参数设置为 true 也是如此。

Classic Console 会话

Worksheets Worksheet 选项卡 选项卡中,Snowflake 每次创建新工作表时都会创建一个新会话。每个工作表的空闲行为最多限制为 4 小时,并且每个工作表的空闲超时都会单独跟踪。

当工作表 关闭 时,该工作表的用户会话结束。

任何 打开 的工作表的 4 小时时间限制到期后,Snowflake 会将用户从 Web 界面中注销。

备注

请注意,滚动查询结果集或对数据集排序等被动行为不会重置空闲会话超时跟踪器。

为了防止会话过早关闭并从 Classic Console 注销,请将任何必要的 SQL 语句保存到本地文件并关闭任何打开的未使用的工作表。

监控会话使用情况

您可以使用 Snowsight 或 SQL 视图监控活动会话和会话使用情况。您可以查看自己的会话,也可以使用具有访问权限的角色查看 SESSIONS 视图来查看您账户的会话。请参阅 ACCOUNT_USAGE 架构 SNOWFLAKE 数据库角色

SQL:

在共享的 SNOWFLAKE 数据库的 ACCOUNT USAGE 架构中查询 SESSIONS 视图以监控会话使用情况。

Snowsight:

选择 Admin » Security,然后选择 Sessions。您可以查看会话 ID、用户名、开始时间、用于会话的客户端驱动程序、客户端网络地址和身份验证方法。将鼠标悬停在开始时间上,即可查看会话开始的确切日期和时间,以您当地时区为准。

会话策略

会话策略定义了 空闲 会话超时时间(以分钟为单位),并提供替换默认空闲超时值 4 小时的选项。

可以为账户或用户设置会话策略,并具有可配置的空闲超时时间,以满足合规性要求。如果用户同时与账户和用户级会话策略关联,则用户级会话策略优先。在账户或用户上设置会话策略后,Snowflake 会强制执行会话策略。

有两个属性治理会话策略行为:

  • SESSION_IDLE_TIMEOUT_MINS 适用于程序化客户端和 Snowflake 客户端。

  • SESSION_UI_IDLE_TIMEOUT_MINS 适用于 Classic Console 和 Snowsight。

超时时间从成功对 Snowflake 进行身份验证开始。如果未设置会话策略,Snowflake 将使用默认值 240 分钟(即 4 小时)。会话策略的最小可配置空闲超时值为 5 分钟。当会话过期时,用户必须再次向 Snowflake 进行身份验证。但是,Snowflake 不强制执行 自定义注销端点 的任何设置。

有关更多信息,请参阅 管理会话策略

注意事项

  • 如果客户端支持 CLIENT_SESSION_KEEP_ALIVE 选项并且该选项设置为 TRUE,只要与 Snowflake 的连接处于活动状态,客户端就会无限期地保留 Snowflake 会话。否则,如果该选项设置为 FALSE,会话会在 4 小时后结束。如果可能,请避免使用此选项,因为它可能会打开大量会话,并对资源提出更大的需求,从而导致性能下降。

  • 您可以使用 CLIENT_SESSION_KEEP_ALIVE_HEARTBEAT_FREQUENCY 参数指定客户端尝试更新会话令牌之间的秒数。Web 界面会话可以随着 Snowflake 对象的继续使用而刷新,例如执行 DDL 和 DML 语句。Snowflake 每 30 秒检查一次此行为。

  • 创建新工作表或打开现有工作表将继续使用已建立的用户会话,但其空闲会话超时重置为 0。

  • 跟踪会话策略的使用情况:

    • 查询 Account Usage SESSION_POLICIES 视图,为 Snowflake 账户中的每个会话策略返回一行。

    • 使用 Information Schema 表函数 POLICY_REFERENCES 为分配给指定会话策略的每个用户返回一行,并为分配给 Snowflake 账户的会话策略返回一行。

      目前,会话策略仅支持以下语法:

      POLICY_REFERENCES( POLICY_NAME => '<session_policy_name>' )
      
      Copy

      其中,session_policy_name 是会话策略的完全限定名称。

      例如,执行以下查询,为分配了名为 session_policy_prod_1 的会话策略的每个用户返回一行,该策略存储在名为 my_db 的数据库和名为 my_schema 的架构中:

      SELECT *
      FROM TABLE(
        MY_DB.INFORMATION_SCHEMA.POLICY_REFERENCES(
          POLICY_NAME => 'my_db.my_schema.session_policy_prod_1'
        )
      );
      
      Copy

限制

未来授权:

不支持对会话策略进行 未来授权

为解决此问题,请向自定义角色授予 APPLY SESSION POLICY 权限,以允许该角色对用户或 Snowflake 账户应用会话策略。

实施会话策略

以下步骤是实施会话策略的代表性指南。

这些步骤假设采用集中管理方法,其中名为 policy_admin 的自定义角色拥有会话策略(即具有会话策略的 OWNERSHIP 权限),并负责在账户或用户上设置会话策略(即具有 APPLY SESSION POLICY on ACCOUNT 权限或 APPLY SESSION POLICY ON USER 权限)。

备注

要为账户设置策略,policy_admin 自定义角色必须具有以下权限:

  • 对包含会话策略的数据库和架构的 USAGE 权限。

  • 在包含会话策略的架构上 CREATE SESSION POLICY。

请按照以下步骤实施会话策略。

第 1 步:创建 POLICY_ADMIN 自定义角色

创建允许用户创建和管理会话策略的自定义角色。在本主题中,示例自定义角色命名为 policy_admin,尽管该角色可以有任何合适的名称。

如果自定义角色已存在,请继续下一步。

否则,请创建 POLICY_ADMIN 自定义角色。

USE ROLE USERADMIN;

CREATE ROLE policy_admin;
Copy

第 2 步:授予 POLICY_ADMIN 自定义角色权限

如果 POLICY_ADMIN 自定义角色尚不具有以下权限,请授予这些权限,如下所示:

  • 对包含会话策略的数据库和架构的 USAGE 权限。

  • 在包含会话策略的架构上 CREATE SESSION POLICY。

  • 账户的 APPLY SESSION POLICY 权限。

  • 如果您计划在用户级别设置会话策略,请对每个用户 APPLY SESSION POLICY。

USE ROLE SECURITYADMIN;

GRANT USAGE ON DATABASE mydb TO ROLE policy_admin;

GRANT USAGE, CREATE SESSION POLICY ON SCHEMA mydb.policies TO ROLE policy_admin;

GRANT APPLY SESSION POLICY ON ACCOUNT TO ROLE policy_admin;
Copy

如果将会话策略与单个用户关联:

GRANT APPLY SESSION POLICY ON USER jsmith TO ROLE policy_admin;
Copy

有关更多信息,请参阅 DDL 命令、操作和权限总结

步骤 3:创建新的会话策略

使用 POLICY_ADMIN 自定义角色创建新的会话策略,其中程序化客户端、Snowflake 客户端和 Web 界面的空闲超时值均为 60 分钟。有关更多信息,请参阅 CREATE SESSION POLICY

USE ROLE POLICY_ADMIN;

CREATE SESSION POLICY mydb.policies.session_policy_prod_1
  SESSION_IDLE_TIMEOUT_MINS = 60
  SESSION_UI_IDLE_TIMEOUT_MINS = 60
  COMMENT = 'Session policy for the prod_1 environment'
;
Copy

其中:

mydb.policies.session_policy_prod_1

会话策略的完全限定名称。

session_idle_timeout_mins = 60

Snowflake 客户端和程序化客户端的空闲超时时间(以分钟为单位)。

session_ui_idle_timeout_mins = 30

Snowflake Web 界面的空闲超时时间(以分钟为单位)。

comment = 'Session policy for the prod_1 environment'

指定会话策略目的的注释。

第 4 步:设置账户或用户的会话策略

使用 POLICY_ADMIN 自定义角色,使用 ALTER ACCOUNT 命令在账户上设置策略,或使用 ALTER USER 命令在用户(例如用户名 jsmith)上设置策略。

USE ROLE policy_admin;

ALTER ACCOUNT SET SESSION POLICY mydb.policies.session_policy_prod_1;

ALTER USER jsmith SET SESSION POLICY my_database.my_schema.session_policy_prod_1_jsmith;
Copy

重要

要替换已为账户或用户设置的会话策略,请先取消设置会话策略,然后为账户或用户设置新的会话策略。例如:

ALTER ACCOUNT UNSET session policy;

ALTER ACCOUNT SET SESSION POLICY mydb.policies.session_policy_prod_2;
Copy

第 5 步:将会话策略复制到目标账户

可以使用数据库复制和账户复制将会话策略及其参考(即对用户或账户的分配)从源账户复制到目标账户。有关详细信息,请参阅:

管理会话策略

会话策略权限参考

Snowflake 支持以下会话策略权限来确定用户是否可以创建、设置和拥有会话策略。

请注意,对架构中的对象进行操作还需要对父数据库和架构具有 USAGE 权限。

权限

用途

CREATE

允许在架构中创建新的会话策略。

APPLY SESSION POLICY

允许在账户或用户级别应用会话策略。

OWNERSHIP

授予对会话策略的完全控制权。需要更改会话策略的大多数属性。

DDL 命令、操作和权限总结

下表总结了会话策略 DDL 操作及其所需权限之间的关系。

操作

需要权限

创建会话策略

具有架构 CREATE SESSION POLICY 权限的角色。

更改会话策略

具有会话策略的 OWNERSHIP 权限的角色。

弃用会话策略

具有会话策略的 OWNERSHIP 权限的角色。

描述会话策略

具有会话策略的 OWNERSHIP 权限 . 具有账户的 APPLY SESSION POLICY 权限的角色。

显示会话策略

具有会话策略的 OWNERSHIP 权限 . 具有账户的 APPLY SESSION POLICY 权限的角色。

设置和取消设置会话策略

对于账户,具有账户 APPLY SESSION POLICY 权限和会话策略 OWNERSHIP 权限的角色, 具有账户 APPLY SESSION POLICY 权限和特定会话策略 APPLY ON SESSION POLICY 权限的角色。

对于用户,对 USER <username> 具有 APPLY SESSION POLICY 权限的角色。

会话策略 DDL 参考

Snowflake 提供以下 DDL 命令来管理会话策略对象:

要设置或取消设置账户的会话策略,请执行 ALTER ACCOUNT 命令,如下所示。

ALTER ACCOUNT SET SESSION POLICY mydb.policies.session_policy_prod_1;
Copy
ALTER ACCOUNT UNSET SESSION POLICY;
Copy

要设置或取消设置用户级别会话策略,请执行 ALTER USER 命令,如下所示。

ALTER USER jsmith SET SESSION POLICY mydb.policies.session_policy_prod_1_jsmith;
Copy
ALTER USER jsmith UNSET SESSION POLICY;
Copy

会话策略故障排除

  • 如果将会话策略分配给账户或用户,并且将包含该会话策略的数据库或架构删除,然后将新的会话策略分配给该账户或用户,则该用户将不会被保留到新会话策略中的空闲会话超时值。

    解决方法是使用 ALTER ACCOUNT 命令从账户取消设置原始会话策略,或使用 ALTER USER 命令从用户取消设置原始会话策略,如 本主题内容 所示。

  • 下表总结了会话策略可能出现的一些错误消息。

    行为

    错误消息

    故障排除操作

    无法创建会话策略。

    无法执行 CREATE SESSION POLICY。该会话没有当前数据库。调用“USE DATABASE”,或使用限定名称。

    在执行 CREATE SESSION POLICY 之前指定数据库,或在 CREATE SESSION POLICY 语句中使用完全限定的对象名称。

    无法创建会话策略。

    SQL 访问控制错误:没有足够的权限来操作架构“<schema_name>”

    验证执行 CREATE SESSION POLICY 语句的角色是否具有针对 SCHEMA 的 CREATE SESSION POLICY 权限。

    无法创建会话策略。

    SQL 编译错误:数据库“<database_name>”不存在或未授权。

    验证数据库是否存在,以及执行 CREATE SESSION POLICY 语句的角色对会话策略应存在的架构具有 USAGE 权限。

    无法执行描述语句。

    SQL 编译错误:架构“<schema_name>”不存在或未授权。

    验证执行 DESC SESSION POLICY 语句的角色是否具有会话策略的 OWNERSHIP 权限 会话策略的 APPLY 权限。

    无法弃用会话策略。

    SQL 编译错误:会话策略“<policy_name>”不存在或未授权。

    验证执行 DROP SESSION POLICY 语句的角色是否具有会话策略的 OWNERSHIP 权限。

    无法弃用会话策略。

    会话策略 <policy_name> 无法弃用,因为它已附加到账户。

    使用 ALTER ACCOUNT 语句从账户取消设置会话策略,然后再次尝试弃用语句。

    无法在账户上设置会话策略。

    会话策略“<policy_name>”已附加到账户 <account_name>。

    一个账户只能有一个处于活动状态的会话策略。确定应为账户设置哪个会话策略。. 如有必要,请使用 ALTER ACCOUNT 从账户取消设置当前会话策略;然后使用另一个 ALTER ACCOUNT 命令在该账户上设置其他会话策略。

    无法设置超时值。

    SQL 编译错误:属性“session_idle_timeout_mins”的值“<integer>”无效

    会话超时值(以分钟为单位)必须是 5240 之间的整数,包含两者。. 为会话超时选择一个有效的整数,然后再次执行 CREATE 或 ALTER SESSION POLICY 语句。

    无法更新现有会话策略。

    SQL 编译错误:会话策略“<policy_name>”不存在或未授权。

    验证会话策略的名称、 ALTER SESSION POLICY 命令的语法以及对会话策略、数据库和架构进行操作的权限。

语言: 中文