类别:

上下文函数

POLICY_CONTEXT

根据一个或多个上下文函数的值模拟查询结果,这让您可以确定策略如何影响查询结果。 上下文函数根据查询的当前上下文返回一个值,例如,谁在执行查询或执行查询的账户。策略主体通常使用上下文函数来确定要从策略返回哪个值。

此函数评估以下策略,以确定查询结果:

语法

EXECUTE USING
POLICY_CONTEXT( <arg_1> => '<string_literal>' [ , <arg_2> => '<string_literal>' , ... , <arg_n> => '<string_literal>' ] )
AS
SELECT <query>
Copy

实参

arg_1 => 'string_literal'

将上下文函数及其值指定为字符串。

必填。必须至少指定一个函数及其值。

Snowflake 支持下面的上下文函数及其值作为实参:

要确定用作字符串值的格式,请使用该函数执行查询。例如:

SELECT CURRENT_USER();

+----------------+
| CURRENT_USER() |
|----------------|
| JSMITH         |
+----------------+
Copy

字符串值应为 'JSMITH'

请注意,如果指定 CURRENT_AVAILABLE_ROLES 和多个角色值(如 ROLE1ROLE2),请将角色列表括在方括号中,如下所示:

['ROLE1', 'ROLE2']

arg_2 => 'string_literal' , ... , arg_n => 'string_literal'

指定上下文函数的逗号分隔列表及其作为字符串的值。

可选。

query

指定要查询一个或多个表或视图的 SQL 表达式。

必填。

使用说明

  • 此函数需要:

    • 至少一个实参,用于指定受支持的上下文函数及其值。

    • 如果表受策略保护,则必须为指定的用户或角色授予以下权限:

      • 表或视图的 OWNERSHIP、以及

      • 策略的 APPLY 权限(在账户级别或策略本身上):

        • ACCOUNT 的 APPLY MASKING POLICY MASKING POLICY policy_name 的 APPLY

        • ACCOUNT 的 APPLY ROW ACCESS POLICY ROW ACCESS POLICY policy_name 的 APPLY

        • ACCOUNT 的 APPLY AGGREGATION POLICY AGGREGATION POLICY policy_name 的 APPLY

        • ACCOUNT 的 APPLY PROJECTION POLICY PROJECTION POLICY policy_name 的 APPLY

  • 如果符合以下任一条件,Snowflake 将返回错误消息:

    • 使用一个或多个不受支持的函数作为实参。Snowflake 仅支持 实参 部分中列出的函数。

    • 未正确指定函数字符串值,包括将字符串用于不存在的值(例如,没有账户、用户或角色)。

    • SELECT query 表达式未正确查询表或视图(例如,根本没有指定表或视图)。

    • 某些数据共享用例(请参阅下一个要点)。

  • 数据共享:

    • 数据共享使用者不能使用此函数来模拟数据共享提供商提供的表或视图查询结果。

      此外,如果使用者 query 表达式包含通过 Secure Data Sharing 提供的表或视图,以及使用者账户中未与数据共享提供商账户关联的另一个表或视图(即他们自己的表或视图),则 Snowflake 将返回错误消息。

    • 数据共享提供商账户可以模拟数据共享使用者账户如何查看通过共享提供的表或视图。

      为此,数据共享提供商将使用者账户名称指定为实参。例如:

      execute using policy_context(current_account => '<consumer_account_name>') ... ;
      
      Copy
  • 结果取决于以下因素:

    • 在列上设置的掩码策略或投影策略(如果有)。

    • 在表或视图上设置的行访问策略或聚合策略(如果有)。

    • 策略定义。

    • query 表达式。

    • 授予角色的权限。

    • 授予用户的角色(包括角色层次结构)。

    • 此函数中的实参。

    重要

    如果此函数的结果与预期 不符

    • 请咨询内部策略管理员,以确定哪些表、视图和列受策略保护,并更好地了解这些策略的正文定义。此管理员可能具有类似 POLICY_ADMINMASKING_ADMINRAP_ADMIN 的自定义角色。

    • 请仔细检查:

      • 函数字符串值。

      • SELECT query 表达式。

      • 授予角色 的权限(例如表或视图上的 SELECT、父数据库和架构上的 USAGE)和相应的 权限继承

      • 角色层次结构,尤其是在将 CURRENT_AVAILABLE_ROLES 函数及其值指定为此函数的实参时。

    根据需要使用此函数更新 SQL 语句,然后重试。

示例

模拟查询 empl_info 表的 PUBLIC 系统角色的效果:

execute using policy_context(current_role => 'PUBLIC') as select * from empl_info;
Copy
语言: 中文