- 类别:
:doc:`/sql-reference/functions-context`(会话对象)
IS_ROLE_IN_SESSION¶
验证指定的账户角色是否在当前活动的主要或次要角色层次结构中。
此函数仅查看 当前 活跃的角色集,不查看会话中激活的角色。当前活动的角色可能与会话角色不同,例如,在执行所有者权限程序或 Streamlit 时。
- 另请参阅:
语法¶
字面量 – 直接指定角色。
IS_ROLE_IN_SESSION( '<string_literal>' )
表达式 – 指定角色表达式:
IS_ROLE_IN_SESSION( <expr> )
列 – 指定一列:
IS_ROLE_IN_SESSION( <column_name> )
实参¶
'string_literal'
角色的名称。
expr
返回角色名称的表达式。
column_name
包含角色名称的表或视图中的列名称。
返回¶
TRUE
:对于字符串字面量或表达式实参,会话中当前用户的活动 主要角色或辅助角色 继承指定角色的权限。
当
DEFAULT_SECONDARY_ROLES
值为ALL
时,授予用户的 任何 角色都会继承指定角色的权限。指定的角色可以是当前的主要角色或辅助角色(即分别由 CURRENT_ROLE 或 CURRENT_SECONDARY_ROLES 返回的角色),也可以是角色层次结构中更低级的任何角色。
对于列实参,Snowflake 会计算每一行,并返回包含指定用户当前会话中活跃的主要或辅助角色的值的一行。每一行对应于活跃的主要角色或辅助角色可以看到的角色名称。
FALSE
对于字符串字面量或表达式实参,指定的角色在当前主要角色或辅助角色的角色层次结构中的更高层次,或者该角色根本不在角色层次结构中。
对于非字面实参,Snowflake 会计算每一行。如果行包含的角色名称在当前主要角色或辅助角色的角色层次结构中的更高层次,或者根本不在角色层次结构中,则 Snowflake 不会返回此行。在这种情况下,Snowflake 仅返回包含活跃的主要角色或辅助角色可以看到的角色名称(如果有)的行。
NULL
当在共享对象(例如安全视图)中使用时,若通过数据共享使用者账户访问,则此函数将返回 NULL。此行为可防止在数据共享使用者账户中公开角色层次结构。
使用说明¶
使用一种语法。
名称语法:
只能传递一个角色名称作为实参。
该实参必须是字符串,并使用与 Snowflake 中角色存储方式相同的大小写。有关详细信息,请参阅 标识符要求。
列语法:
只能传递一列作为实参。
该列必须是 STRING 数据类型。
将列指定为以下列类型之一:
column_name
table_name.column_name
schema_name.table_name.column_name
database_name.schema_name.table_name.column_name
虚拟列
不 支持虚拟列,虚拟列包含表达式计算值的结果,而不是存储在表中的计算值。
SELECT IS_ROLE_IN_SESSION(UPPER(authz_role)) FROM t1;
只有当表达式为列名称提供别名时,才支持虚拟列:
CREATE VIEW v2 AS SELECT authz_role, UPPER(authz_role) AS upper_authz_role FROM t2; SELECT IS_ROLE_IN_SESSION(upper_authz_role) FROM v2;
策略:
如果将这些函数与 掩码策略 或 行访问策略 结合使用,请验证您的 Snowflake 账户是否为 Enterprise Edition 或更高版本。
Snowflake 建议在策略条件需要评估角色层次结构和继承权限时使用此函数。
结果缓存:
如果在掩码策略或行访问策略中使用此函数,并且策略和受策略保护的表或列自上一个查询以来并未更改,则可以使用 RESULT_SCAN 函数返回受保护表的查询结果。结果缓存仅适用于使用非字面语法时。
这些函数不能在物化视图定义中使用,因为这些函数不是确定性的,并且 Snowflake 无法确定要物化的数据。
示例¶
验证授予指定角色的权限是否由会话中的当前角色继承:
SELECT IS_ROLE_IN_SESSION('ANALYST'); +-------------------------------+ | IS_ROLE_IN_SESSION('ANALYST') | |-------------------------------| | True | +-------------------------------+
为名为 ROLE_NAME 的列返回活跃的主要或辅助角色值:
SELECT * FROM d1.s1.t1 WHERE IS_ROLE_IN_SESSION(t1.role_name);
直接在掩码策略条件下指定角色:
CREATE OR REPLACE MASKING POLICY allow_analyst AS (val string) RETURNS string -> CASE WHEN IS_ROLE_IN_SESSION('ANALYST') THEN val ELSE '*******' END;
在掩码策略条件下指定角色表达式:
CREATE OR REPLACE MASKING POLICY allow_tag_role AS (val string) RETURNS string -> CASE WHEN IS_ROLE_IN_SESSION(SYSTEM$GET_TAG_ON_CURRENT_TABLE('D1.S1.ALLOWED_ROLE')) THEN val ELSE '*******' END;
在行访问策略中指定名为 AUTHZ_ROLE(即授权角色)的列,然后在表列上设置策略:
创建策略:
CREATE OR REPLACE ROW ACCESS POLICY rap_authz_role AS (authz_role string) RETURNS boolean -> IS_ROLE_IN_SESSION(authz_role);将策略添加到表中:
ALTER TABLE allowed_roles ADD ROW ACCESS POLICY rap_authz_role ON (authz_role);
在行访问策略中指定名为 AUTHZ_ROLE 的列,该策略使用映射表在名为 ROLE_NAME 的映射表列中查找授权角色。创建策略后,将策略添加到包含 AUTHZ_ROLE 列的表中:
创建策略:
CREATE OR REPLACE ROW ACCESS POLICY rap_authz_role_map AS (authz_role string) RETURNS boolean -> EXISTS ( SELECT 1 FROM mapping_table m WHERE authz_role = m.key and IS_ROLE_IN_SESSION(m.role_name) );将策略添加到表中:
ALTER TABLE allowed_roles ADD ROW ACCESS POLICY rap_authz_role_map ON (authz_role);