类别:

上下文函数 (会话对象)

IS_DATABASE_ROLE_IN_SESSION

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

另请参阅:

IS_ROLE_IN_SESSION

语法

字面量 – 直接指定数据库角色:

IS_DATABASE_ROLE_IN_SESSION( '<string_literal>' )
Copy

非字面 – 指定列:

IS_DATABASE_ROLE_IN_SESSION( <column_name> )
Copy

实参

'string_literal'

数据库角色的名称。

指定数据库角色的相对名称。如果指定的是完全限定名称,则函数的值为 False

column_name

表或视图中的列名。

返回

True
  • 对于字面量实参(数据库角色名称),当前用户在会话中的活动 主要角色或辅助角色 将继承指定数据库角色的权限。

  • 对于非字面实参(列名),Snowflake 会评估表中的每一行,并返回包含指定用户当前会话中的数据库角色的值的一行。每行对应于一个数据库角色名称,该名称源自正在使用的数据库或查询中的指定数据库。

False
  • 对于字面量实参,指定的数据库角色不在当前用户的主要角色或辅助角色的角色层次结构中。

  • 对于非字面实参,如果数据库角色不在正在使用的数据库或查询中指定的数据库的表列中,则 Snowflake 不会返回行。

  • 指定数据库角色的完全限定名称,格式为 database_name.database_role_name。改为使用相对名称 database_role_name

使用说明

这些说明仅适用于 IS_DATABASE_ROLE_IN_SESSION 函数:

  • 当函数实参为字符串字面量时,使用此表预测函数的计算结果:

    上下文

    评估

    查询。

    会话数据库。

    带有 WHERE 子句的表或视图定义。

    取决于以下项:

    • 如果有正在使用的数据库,并且使用了表或视图的相对名称,则上下文就是正在使用的数据库(会话数据库)。

    • 如果指定表或视图的完全限定名称,上下文就是包含表或视图的数据库。

    受保护的表或视图。

    包含表或视图的数据库。

    所有者权限存储过程。

    包含存储过程的数据库。

    调用方权限存储过程。

    会话数据库。

    UDF

    包含受保护表或视图的数据库。

    如果未在策略中调用 UDF,则函数的计算结果是包含 UDF 的数据库。

  • 当包含数据库角色的数据库正在使用,或查询包含该数据库角色的同一数据库中的表时,数据库角色将在角色层次结构中变为活跃状态。

    如果您是数据共享使用者,并且正在使用数据库角色查询受策略保护的数据,在查询该数据之前,请使用 USE DATABASE database_name 命令加载包含 受保护表 的数据库。有关详细信息,请参阅 共享受策略保护的数据

  • 在数据访问策略(如掩码策略或行访问权限策略)的 body 中指定此函数时,函数会使用受保护表的数据库和架构。

    例如,如果在 hr.tables.empl_info 表中添加行访问权限策略,函数会在 hr 数据库中搜索其实参、数据库角色名或列名,因为该数据库包含受保护的表。

  • 您应避免使用要求 Snowflake 创建内联视图的查询结构。在此背景下,内联视图是 Snowflake 为确定查询结果而创建的临时视图。例如,如果您的查询调用此函数,而您在查询开头指定了 WITH 子句,或是在 FROM 子句中指定了子查询,Snowflake 将返回错误:

    Could not resolve the database for IS_DATABASE_ROLE_IN_SESSION({})
    

    其中 {} 是查询中函数实参的占位符。出错的原因是 Snowflake 没有足够的信息来评估函数实参的上下文。要解决错误消息,请简化查询,如移除 WITH 子句或移除 FROM 子句中的子查询。

  • 用户属性DEFAULT_SECONDARY_ROLES 值为 ALL 时,如果授予用户的 任何 账户角色继承了指定数据库角色的权限,则函数返回 True

  • 在保护 共享数据 的掩码策略或行访问策略的条件下使用此函数时,请确保包含该策略的数据库和受策略保护的数据都共享到使用者账户中。策略和受策略保护的数据可以位于同一数据库中,也可以位于不同的数据库中。有关详细信息,请参阅 共享受策略保护的数据

这些说明适用于 IS_DATABASE_ROLE_IN_SESSION 和 IS_ROLE_IN_SESSION 函数:

  • 使用一种语法。

  • 字面量语法:

    • 只能传递一个数据库角色名称作为实参。

    • 该实参必须是字符串,并使用与 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_DATABASE_ROLE_IN_SESSION('R1');
Copy
+-----------------------------------+
| IS_DATABASE_ROLE_IN_SESSION('R1') |
+-----------------------------------+
| True                              |
+-----------------------------------+

返回名为 ROLE_NAME 列的数据库角色值:

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

有关 Secure Data Sharing 的其他示例,请参阅 共享受策略保护的数据

语言: 中文