ALTER ROW ACCESS POLICY¶
修改现有行访问策略的属性,包括重命名策略或替换策略规则。
在下一个使用行访问策略的 SQL 查询运行时,对策略规则所做的任何更改才会生效。
- 另请参阅:
语法¶
ALTER ROW ACCESS POLICY [ IF EXISTS ] <name> RENAME TO <new_name>
ALTER ROW ACCESS POLICY [ IF EXISTS ] <name> SET BODY -> <expression_on_arg_name>
ALTER ROW ACCESS POLICY [ IF EXISTS ] <name> SET TAG <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' ... ]
ALTER ROW ACCESS POLICY [ IF EXISTS ] <name> UNSET TAG <tag_name> [ , <tag_name> ... ]
ALTER ROW ACCESS POLICY [ IF EXISTS ] <name> SET COMMENT = '<string_literal>'
ALTER ROW ACCESS POLICY [ IF EXISTS ] <name> UNSET COMMENT
参数¶
name
行访问策略的标识符;在策略的父架构中必须是唯一的。
标识符值必须以字母字符开头,且不能包含空格或特殊字符,除非整个标识符字符串放在双引号内(例如
"My object"
)。放在双引号内的标识符也区分大小写。有关更多详细信息,请参阅 标识符要求。
RENAME TO new_name
指定行访问策略的新标识符;对于您的架构必须是唯一的。如果新标识符已用于其他的行访问策略,则不能使用该标识符。
有关更多详细信息,请参阅 标识符要求。
可以将对象移动到其他数据库和/或架构,同时选择重命名对象。为此,请指定一个限定
new_name
值,该值分别以db_name.schema_name.object_name
或schema_name.object_name
的形式包含新数据库和/或架构名称。备注
目标数据库和/或架构必须已存在。此外,新位置中不能存在同名对象;否则,该语句将返回错误。
除非 对象所有者(即对对象拥有 OWNERSHIP 权限的角色)也拥有目标架构,否则禁止将对象移动到托管访问架构。
SET ...
指定要为行访问策略设置的一个(或多个)属性:
BODY -> expression_on_arg_name
可筛选数据的 SQL 表达式。
表达式可以包括表示条件逻辑的 条件表达式函数、内置函数或用于转换数据的 UDFs。
如果在行访问策略的正文中使用了 UDF 或外部函数,则策略所有者必须对 UDF 或外部函数具有 OWNERSHIP 权限。对应用了行访问策略的数据库对象进行查询时,用户不需要对 UDF 或外部函数具有 USAGE 权限。
TAG tag_name = 'tag_value' [ , tag_name = 'tag_value' , ... ]
指定 标签 名称和标签字符串值。
标签值始终为字符串,标签值的最大字符数为 256。
有关在语句中指定标签的信息,请参阅 对象和列的标签配额。
COMMENT = 'string_literal'
为掩码策略添加注释或覆盖现有注释。
默认:无值
UNSET ...
指定要为掩码策略取消设置的一个或多个属性和/或参数,这会将其重置为默认值:
TAG tag_name [ , tag_name ... ]
COMMENT
重置属性/参数时,请仅指定名称;指定属性的值将返回错误。
访问控制要求¶
权限 |
对象 |
备注 |
---|---|---|
OWNERSHIP |
行访问策略 |
OWNERSHIP is a special privilege on an object that is automatically granted to the role that created the object, but can also be transferred using the GRANT OWNERSHIP command to a different role by the owning role (or any role with the MANAGE GRANTS privilege). |
请注意,对架构中的对象进行操作还需要对父数据库和架构具有 USAGE 权限。
有关创建具有指定权限集的自定义角色的说明,请参阅 创建自定义角色。
有关对 安全对象 执行 SQL 操作的相应角色和权限授予的一般信息,请参阅 访问控制概述。
有关行访问策略 DDL 和权限的其他详细信息,请参阅 管理行访问策略。
使用说明¶
如果您想要更新现有的行访问策略,并需要查看该策略的当前定义,请调用 GET_DDL 函数或运行 DESCRIBE ROW ACCESS POLICY 命令。
您无法更改策略签名(即实参名称或输入/输出数据类型)。同样,如果策略被附加到了表或视图,则不支持使用
CREATE OR REPLACE ROW ACCESS POLICY
。如果您需要更改签名,请对该策略执行 DROP ROW ACCESS POLICY 语句并创建新的行访问策略。在执行 ALTER 语句之前,您可以执行 DESCRIBE ROW ACCESS POLICY 语句,确定用于更新策略的实参名称。
在策略正文中包含一个或多个 子查询 可能会导致错误。如果可能,限制子查询的数量,限制 JOIN 操作的数量,并简化 WHERE 子句条件。
如果策略
body
包含映射表查找,请创建一个集中式映射表,并将映射表存储在受保护表所在的数据库中。在body
调用 IS_DATABASE_ROLE_IN_SESSION 函数时,这一点尤其重要。有关详细信息,请参阅函数使用说明。关于元数据:
注意
客户应确保在使用 Snowflake 服务时,不会将个人数据(用户对象除外)、敏感数据、出口管制数据或其他受监管数据作为元数据输入。有关更多信息,请参阅 Snowflake 中的元数据字段。
示例¶
以下示例更新了行访问策略。
DESC ROW ACCESS POLICY rap_table_employee_info;
+-------------------------+-------------+-------------+------+
| name | signature | return_type | body |
+-------------------------+-------------+-------------+------+
| rap_table_employee_info | (V VARCHAR) | BOOLEAN | true |
+-------------------------+-------------+-------------+------+
ALTER ROW ACCESS POLICY rap_table_employee_info SET BODY -> false;