管理会话策略¶
本主题介绍 Snowflake 会话和会话策略,并提供在账户或用户级别配置会话策略的说明。
会话策略权限¶
Snowflake 支持以下会话策略权限来确定用户是否可以创建、设置和拥有会话策略。
请注意,对架构中的对象进行操作还需要对父数据库和架构具有 USAGE 权限。
权限 |
用途 |
---|---|
CREATE SESSION POLICY |
允许在架构中创建新的会话策略。 |
APPLY SESSION POLICY |
允许在账户或用户级别应用任何会话策略。 |
OWNERSHIP |
授予对会话策略的完全控制权。需要更改会话策略的大多数属性。 |
命令、操作和权限总结¶
下表总结了会话策略 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;ALTER ACCOUNT UNSET SESSION POLICY;
要设置或取消设置用户级别会话策略,请执行 ALTER USER 命令,如下所示。
ALTER USER jsmith SET SESSION POLICY mydb.policies.session_policy_prod_1_jsmith;ALTER USER jsmith UNSET SESSION POLICY;
审计会话策略¶
您可以查询 SESSION_POLICIES 视图 视图,为您的 Snowflake 账户中的每个会话策略及其元数据返回一行。
您可以调用 POLICY_REFERENCES 函数,为分配给指定会话策略的每个用户返回一行,并为分配给 Snowflake 账户的会话策略返回一行。
目前,会话策略仅支持以下语法:
POLICY_REFERENCES( POLICY_NAME => '<session_policy_name>' )
其中,
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' ));
会话策略故障排除¶
如果将会话策略分配给账户或用户,并且将包含该会话策略的数据库或架构删除,然后将新的会话策略分配给该账户或用户,则该用户将不会被保留到新会话策略中的空闲会话超时值。
解决方法是使用 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>”无效
会话超时值(以分钟为单位)必须是
5
到240
之间的整数,包含两者。. 为会话超时选择一个有效的整数,然后再次执行 CREATE 或 ALTER SESSION POLICY 语句。无法更新现有会话策略。
SQL 编译错误:会话策略“<policy_name>”不存在或未授权。
验证会话策略的名称、ALTER SESSION POLICY 命令的语法以及对会话策略、数据库和架构进行操作的权限。