CREATE ROW ACCESS POLICY

在当前/指定的架构中创建新的行访问策略或替换现有的行访问策略。

创建行访问策略后,使用 ALTER TABLE 命令将该策略添加到表中,或使用 ALTER VIEW 命令将该策略添加到视图中。

另请参阅:

行访问策略 DDL

语法

Snowflake 支持以下语法来创建行访问策略。

CREATE [ OR REPLACE ] ROW ACCESS POLICY [ IF NOT EXISTS ] <name> AS
( <arg_name> <arg_type> [ , ... ] ) RETURNS BOOLEAN -> <body>
[ COMMENT = '<string_literal>' ]
Copy

必填参数

name

行访问策略的标识符;对于您的架构必须是唯一的。

标识符值必须以字母字符开头,且不能包含空格或特殊字符,除非整个标识符字符串放在双引号内(例如 "My object")。放在双引号内的标识符也区分大小写。

有关更多详细信息,请参阅 标识符要求

AS ( <arg_name> <arg_type> [ , ... ] )

行访问策略的签名。

签名指定了一组属性,在确定该行是否可访问时必须考虑这些属性。属性值来自受行访问策略保护的数据库对象(例如表或视图)。

RETURNS BOOLEAN

行访问策略必须评估为 true 或 false。查询受行访问策略保护的表的用户会根据 body 的写入方式看到输出中的行。

body

SQL 表达式,该表达式对签名中的实参值进行操作,以确定对受行访问策略保护的表进行查询时要返回哪些行。

body 可以是任何布尔值 SQL 表达式。Snowflake 支持调用 用户定义函数概述编写外部函数 的表达式以及使用子查询的表达式。

可选参数

COMMENT = 'string_literal'

指定行访问策略的注释。

默认:无值

访问控制要求

用于执行此 SQL 命令的 角色 必须至少具有以下 权限

权限

对象

备注

CREATE ROW ACCESS POLICY

架构

请注意,对架构中的对象进行操作还需要对父数据库和架构具有 USAGE 权限。

有关创建具有指定权限集的自定义角色的说明,请参阅 创建自定义角色

有关对 安全对象 执行 SQL 操作的相应角色和权限授予的一般信息,请参阅 访问控制概述

有关掩码策略 DDL 和权限的其他详细信息,请参阅 管理列级安全性

使用说明

  • 在策略正文中包含一个或多个 子查询 可能会导致错误。如果可能,限制子查询的数量,限制 JOIN 操作的数量,并简化 WHERE 子句条件。

  • 如果数据库对象同时具有行访问策略和一个或多个 掩码策略,则首先评估行访问策略。

    有关查询运行时行访问策略的更多信息,请参阅 了解行访问策略

  • 给定的表或视图列可以在掩码策略签名或行访问策略签名中指定。换句话说,同一列不能同时在掩码策略签名和行访问策略签名中指定。

    有关更多信息,请参阅 CREATE MASKING POLICY

  • 如果策略附加到表或视图,既无法使用 CREATE OR REPLACE ROW ACCESS POLICY,也无法使用 ALTER ROW ACCESS POLICY 来更改策略签名(即实参名称或输入/输出数据类型)。如果您需要更改签名,请对该策略执行 DROP ROW ACCESS POLICY 语句并创建新的行访问策略。

  • 如果策略 body 包含映射表查找,请创建一个集中式映射表,并将映射表存储在受保护表所在的数据库中。在 body 调用 IS_DATABASE_ROLE_IN_SESSION 函数时,这一点尤其重要。有关详细信息,请参阅函数使用说明。

  • 数据共享提供商无法在 阅读者账户 中创建行访问策略。

  • 如果在掩码或行访问策略的正文中指定 CURRENT_DATABASECURRENT_SCHEMA 函数,该函数会返回包含受保护表的数据库或架构,而不是用于会话的数据库或架构。

  • 关于元数据:

    注意

    客户应确保在使用 Snowflake 服务时,不会将个人数据(用户对象除外)、敏感数据、出口管制数据或其他受监管数据作为元数据输入。有关更多信息,请参阅 Snowflake 中的元数据字段

  • CREATE OR REPLACE <object> 语句是原子的。也就是说,当对象被替换时,旧对象将被删除,新对象将在单个事务中创建。

示例

这些示例使用 CURRENT_ROLE 上下文函数。如果策略条件需要角色激活和角色层次结构,请使用 IS_ROLE_IN_SESSION

以下行访问策略允许 CURRENT_ROLE 为 it_admin 自定义角色的用户查看查询结果中包含员工 ID 号(即 empl_id)的行。

create or replace row access policy rap_it as (empl_id varchar) returns boolean ->
  case
      when 'it_admin' = current_role() then true
      else false
  end
;
Copy

如果以下两个条件之一为 true,则以下行访问策略允许用户查看查询结果中的行:

  1. 当前角色是 sales_executive_role 自定义角色。调用 CURRENT_ROLE 函数以确定当前角色。

  2. 当前角色是 sales_manager 自定义角色,并且查询指定了与 salesmanageregions 映射表对应的 sales_region

use role securityadmin;

create or replace row access policy rap_sales_manager_regions_1 as (sales_region varchar) returns boolean ->
  'sales_executive_role' = current_role()
      or exists (
            select 1 from salesmanagerregions
              where sales_manager = current_role()
                and region = sales_region
          )
;
Copy

其中:

rap_sales_manager_regions_1

行访问策略的名称。

as (sales_region varchar)

行访问策略的签名。

签名指定了一组属性,在确定该行是否可访问时必须考虑这些属性。属性值来自受行访问策略保护的表。

returns boolean ->

指定行访问策略的应用程序。

请注意,行访问策略的 <expression> 后面紧跟右箭头(即 ->)。

该表达式可以是任何布尔值 SQL 表达式。Snowflake 支持调用 UDFs、External Functions 的表达式和使用子查询的表达式。

'sales_executive_role' = current_role()

行访问策略表达式的第一个条件,允许具有 sales_executive_role 自定义角色的用户查看数据。

or exists (select 1 from salesmanagerregions where sales_manager = current_role() and region = sales_region)

使用子查询的行访问策略表达式的第二个条件。

子查询要求 CURRENT_ROLE 为 sales_manager 自定义角色,并对数据执行查询以指定 salesmanagerregions 映射表中列出的区域。

以下行访问策略在策略签名中指定了两个属性:

create or replace row access policy rap_test2 as (n number, v varchar)
  returns boolean -> true;
Copy

其中:

rap_test2

行访问策略的名称。

(n number, v varchar)

行访问策略的签名。

签名指定了一组属性,在确定该行是否可访问时必须考虑这些属性。属性值来自受行访问策略保护的表。

returns boolean -> true

确定行访问策略的应用程序。

返回的值确定用户是否有权访问添加了行访问策略的数据库对象上的给定行。

有关其他示例,请参阅 使用行访问策略

语言: 中文