类别:

:doc:`/sql-reference/functions-context`(会话对象)

IS_ROLE_IN_SESSION

验证账户角色是否位于会话的用户活跃主要角色或辅助角色层次结构中,或者指定的列是否包含会话的用户活跃主要角色或辅助角色层次结构中的角色。

另请参阅:

高级列级安全主题

语法

字面量 – 直接指定角色。

IS_ROLE_IN_SESSION( '<string_literal>' )
Copy

非字面 – 指定列:

IS_ROLE_IN_SESSION( <column_name> )
Copy

实参

'string_literal'

角色的名称。

column_name

表或视图中的列名。

返回

TRUE
  • 对于字符串字面量实参,会话中当前用户的活动 主要角色或辅助角色 继承指定角色的权限。

    DEFAULT_SECONDARY_ROLES 值为 ALL 时,授予用户的 任何 角色都会继承指定角色的权限。

    指定的角色可以是当前的主要角色或辅助角色(即分别由 CURRENT_ROLECURRENT_SECONDARY_ROLES 返回的角色),也可以是角色层次结构中更低级的任何角色。

  • 对于非字面实参,Snowflake 会计算每一行,并返回包含指定用户当前会话中活跃的主要或辅助角色的值的一行。每一行对应于活跃的主要角色或辅助角色可以看到的角色名称。

FALSE
  • 对于字符串字面量实参,指定的角色在当前主要角色或辅助角色的角色层次结构中的更高层次,或者根本不在角色层次结构中。

  • 对于非字面实参,Snowflake 会计算每一行。如果行包含的角色名称在当前主要角色或辅助角色的角色层次结构中的更高层次,或者根本不在角色层次结构中,则 Snowflake 不会返回此行。在这种情况下,Snowflake 仅返回包含活跃的主要角色或辅助角色可以看到的角色名称(如果有)的行。

NULL
  • 在数据共享使用者账户中,如果引用共享对象(例如安全 UDF 或安全视图),例如在掩码策略条件下,则此函数返回 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;
    
    Copy

    只有当表达式为列名称提供别名时,才支持虚拟列:

    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;
    
    Copy
  • 策略:

    如果将这些函数与 掩码策略行访问策略 结合使用,请验证您的 Snowflake 账户是否为 Enterprise Edition 或更高版本。

    Snowflake 建议在策略条件需要评估角色层次结构和继承权限时使用此函数。

  • 结果缓存:

    如果在掩码策略或行访问策略中使用此函数,并且策略和受策略保护的表或列自上一个查询以来并未更改,则可以使用 RESULT_SCAN 函数返回受保护表的查询结果。结果缓存仅适用于使用非字面语法时。

  • 这些函数不能在物化视图定义中使用,因为这些函数不是确定性的,并且 Snowflake 无法确定要物化的数据。

示例

验证授予指定角色的权限是否由会话中的当前角色继承:

SELECT IS_ROLE_IN_SESSION('ANALYST');

+-------------------------------+
| IS_ROLE_IN_SESSION('ANALYST') |
|-------------------------------|
| True                          |
+-------------------------------+
Copy

为名为 ROLE_NAME 的列返回活跃的主要或辅助角色值:

SELECT *
FROM myb.s1.t1
WHERE IS_ROLE_IN_SESSION(t1.role_name);
Copy

直接在掩码策略条件下指定角色:

CREATE OR REPLACE MASKING POLICY allow_analyst AS (val string)
RETURNS string ->
CASE
  WHEN IS_ROLE_IN_SESSION('ANALYST') THEN val
  ELSE '*******'
END;
Copy

在行访问策略中指定名为 AUTHZ_ROLE(即授权角色)的列,然后在表列上设置策略:

创建策略:

CREATE OR REPLACE ROW ACCESS POLICY rap_authz_role AS (authz_role string)
RETURNS boolean ->
IS_ROLE_IN_SESSION(authz_role);
Copy

将策略添加到表中:

ALTER TABLE allowed_roles
  ADD ROW ACCESS POLICY rap_authz_role ON (authz_role);
Copy

在行访问策略中指定名为 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)
);
Copy

将策略添加到表中:

ALTER TABLE allowed_roles
  ADD ROW ACCESS POLICY rap_authz_role_map ON (authz_role);
Copy
语言: 中文