ALTER VIEW¶
修改现有视图的属性。目前唯一支持的操作是:
重命名视图。
转换为安全视图(或从安全视图恢复)。
添加、覆盖、删除视图的注释。
请注意,不能 使用此命令更改视图的定义。要更改视图定义,必须删除该视图,然后重新创建该视图。
语法¶
ALTER VIEW [ IF EXISTS ] <name> RENAME TO <new_name>
ALTER VIEW [ IF EXISTS ] <name> SET COMMENT = '<string_literal>'
ALTER VIEW [ IF EXISTS ] <name> UNSET COMMENT
ALTER VIEW [ IF EXISTS ] <name> SET SECURE
ALTER VIEW [ IF EXISTS ] <name> SET CHANGE_TRACKING = { TRUE | FALSE }
ALTER VIEW <name> UNSET SECURE
ALTER VIEW <name> dataMetricFunctionAction
ALTER VIEW [ IF EXISTS ] <name> dataGovnPolicyTagAction
其中:
dataMetricFunctionAction ::= { ADD | DROP } DATA METRIC FUNCTION <metric_name> ON ( <col_name> [ , ... ] ) [ , <metric_name_2> ON ( <col_name> [ , ... ] ) ] [ , ... ] | SET DATA_METRIC_SCHEDULE = { '<num> MINUTE' | 'USING CRON <expr> <time_zone>' | 'TRIGGER_ON_CHANGES' } | UNSET DATA_METRIC_SCHEDULEdataGovnPolicyTagAction ::= { SET TAG <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' ... ] | UNSET TAG <tag_name> [ , <tag_name> ... ] } | { ADD ROW ACCESS POLICY <policy_name> ON ( <col_name> [ , ... ] ) | DROP ROW ACCESS POLICY <policy_name> | DROP ROW ACCESS POLICY <policy_name> , ADD ROW ACCESS POLICY <policy_name> ON ( <col_name> [ , ... ] ) | DROP ALL ROW ACCESS POLICIES } | { SET AGGREGATION POLICY <policy_name> [ FORCE ] | UNSET AGGREGATION POLICY } | ADD [ COLUMN ] [ IF NOT EXISTS ] <col_name> <col_type> [ [ WITH ] MASKING POLICY <policy_name> [ USING ( <col1_name> , <cond_col_1> , ... ) ] ] [ [ WITH ] PROJECTION POLICY <policy_name> ] [ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ] | { { ALTER | MODIFY } [ COLUMN ] <col1_name> SET MASKING POLICY <policy_name> [ USING ( <col1_name> , <cond_col_1> , ... ) ] [ FORCE ] | UNSET MASKING POLICY } | { { ALTER | MODIFY } [ COLUMN ] <col1_name> SET PROJECTION POLICY <policy_name> [ FORCE ] | UNSET PROJECTION POLICY } | { ALTER | MODIFY } [ COLUMN ] <col1_name> SET TAG <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' ... ] , [ COLUMN ] <col2_name> SET TAG <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' ... ] | { ALTER | MODIFY } [ COLUMN ] <col1_name> UNSET TAG <tag_name> [ , <tag_name> ... ] , [ COLUMN ] <col2_name> UNSET TAG <tag_name> [ , <tag_name> ... ]
参数¶
name
指定要更改的视图的标识符。如果标识符包含空格或特殊字符,则整个字符串必须放在双引号内。放在双引号内的标识符也区分大小写。
RENAME TO new_name
指定视图的新标识符;对于架构必须是唯一的。
有关更多详细信息,请参阅 标识符要求。
可以将对象移动到其他数据库和/或架构,同时选择重命名对象。为此,请指定一个限定
new_name
值,该值分别以db_name.schema_name.object_name
或schema_name.object_name
的形式包含新数据库和/或架构名称。备注
目标数据库和/或架构必须已存在。此外,新位置中不能存在同名对象;否则,该语句将返回错误。
除非 对象所有者(即对对象拥有 OWNERSHIP 权限的角色)也拥有目标架构,否则禁止将对象移动到托管访问架构。
重命名对象时,引用该对象的其他对象必须使用新名称进行更新。
SET ...
指定要为视图设置的属性:
SECURE
将视图指定为安全视图。
CHANGE_TRACKING = TRUE | FALSE
指定对表启用或禁用变更跟踪。
TRUE
对视图启用更改跟踪,并将设置级联到所有基础表。FALSE
对视图禁用更改跟踪,并将设置级联到所有基础表。
COMMENT = 'string_literal'
为视图添加注释或覆盖现有注释。
备注
必须单独设置每个视图属性。
UNSET ...
指定要为视图取消设置的属性,这会将其重置为默认值:
SECURE
COMMENT
重置属性时,请仅指定名称;指定属性的值将返回错误。
备注
必须单独重置每个视图属性。
数据指标函数操作 (dataMetricFunctionAction
)¶
{ ADD | DROP } DATA METRIC FUNCTION metric_name
要添加到表或视图中或从表或视图中删除的数据指标函数的标识符。
ON ( col_name [ , ... ] )
要关联数据指标函数的表或视图列。列的数据类型必须与数据指标函数定义中指定的列的数据类型相匹配。
[ , metric_name_2 ON ( col_name [ , ... ] ) [ , ... ] ]
要添加到表中的其他数据指标函数。使用逗号分隔每个数据指标函数及其指定列。
DATA_METRIC_SCHEDULE ...
指定定期运行数据指标函数的计划。
'num MINUTE'
指定在两次运行数据指标函数之间插入的等待时间间隔(以分钟为单位)。仅接受正整数。
还支持
num M
语法。对于数据指标函数,使用以下值之一:
5
、15
、30
、60
、720
或1440
。'USING CRON expr time_zone'
指定用于定期运行数据指标函数的 cron 表达式和时区。支持标准 cron 实用程序语法的子集。
有关时区列表,请参阅 tz 数据库时区列表 (link removed)。
cron 表达式由以下字段组成,定期间隔必须至少为 5 分钟:
# __________ minute (0-59) # | ________ hour (0-23) # | | ______ day of month (1-31, or L) # | | | ____ month (1-12, JAN-DEC) # | | | | _ day of week (0-6, SUN-SAT, or L) # | | | | | # | | | | | * * * * *
支持以下特殊字符:
*
通配符。指定字段的任何出现。
L
代表“last”。在星期几字段中使用时,它允许您指定结构,例如给定月份的“最后一个星期五”(“5L”)。在日期字段中,它指定该月的最后一天。
/{n}
指示给定时间单位的第 n 个实例。每个时间量子都是独立计算的。例如,如果在月份字段中指定
4/3
,则数据指标函数将安排在 4 月、7 月和 10 月执行(即从一年中的第 4 个月开始,每 3 个月一次)。在随后的几年中保持相同的计划。也就是说,数据指标函数 不会 安排在 1 月(10 月运行后 3 个月)运行。
备注
cron 表达式当前仅根据指定的时区进行计算。更改账户的 TIMEZONE 参数值(或在用户或会话级别设置该值) 不会 更改数据指标函数的时区。
cron 表达式定义数据指标函数的所有 有效 运行时间。Snowflake 尝试根据此计划运行数据指标函数;但是,如果在下一个有效运行时间开始之前未完成上一次运行,则跳过任何有效运行时间。
当 cron 表达式中同时包含一个月中的特定日期和一周中的某一天时,数据指标函数将安排在满足一个月中某一天条件 或 一周中某一天条件的日期运行。例如,
DATA_METRIC_SCHEDULE = 'USING CRON 0 0 10-20 * TUE,THU UTC'
计划在每月的 10 号到 20 号以及这些日期之外的任何星期二或星期四的 0AM 运行数据指标函数。cron 中最短的时间粒度为分钟。
'TRIGGER_ON_CHANGES'
指定 DMF 在 DML 操作 修改表(例如插入新行或删除行)时运行。
因 重聚类,对表进行的更改不会触发 DMF 运行。
有关这些操作的访问控制要求的详细信息,请参阅 DMF 权限。
数据治理策略和标签操作 (dataGovnPolicyTagAction
)¶
TAG tag_name = 'tag_value' [ , tag_name = 'tag_value' , ... ]
指定 标签 名称和标签字符串值。
标签值始终为字符串,标签值的最大字符数为 256。
有关在语句中指定标签的信息,请参阅 对象和列的标签配额。
policy_name
策略的标识符;对于架构必须是唯一的。
以下子句适用于支持行访问策略的所有表类型,包括但不限于表、视图和事件表。简而言之,这些子句仅指“表”。
ADD ROW ACCESS POLICY policy_name ON (col_name [ , ... ])
向表中添加行访问策略。
必须至少指定一个列名称。可以使用逗号分隔每个列名称来指定其他列。使用此表达式可以向事件表和外部表添加行访问策略。
DROP ROW ACCESS POLICY policy_name
从表中删除行访问策略。
使用此子句将策略从表中删除。
DROP ROW ACCESS POLICY policy_name, ADD ROW ACCESS POLICY policy_name ON ( col_name [ , ... ] )
在单个 SQL 语句中,删除在表上设置的行访问策略,并向同一个表添加行访问策略。
DROP ALL ROW ACCESS POLICIES
从表中删除 所有 行访问策略关联。
在从事件表中删除策略 之前 从架构中删除行访问策略时,此表达式很有帮助。使用此表达式从表中删除行访问策略关联。
SET AGGREGATION POLICY policy_name [ FORCE ]
为该表分配 聚合策略。使用可选 FORCE 参数以原子方式将现有聚合策略替换为新的聚合策略。
UNSET AGGREGATION POLICY
从表中分离聚合策略。
{ ALTER | MODIFY } [ COLUMN ] ...
USING ( col_name , cond_col_1 ... )
指定要传递到条件掩码策略 SQL 表达式的实参。
列表中的第一列指定用于掩码处理或标记数据的策略条件的列,并且 必须 与设置掩码策略的列匹配。
附加列指定要评估的列,以确定在对第一列进行查询时是否对查询结果的每行中的数据进行掩码处理或标记化。
如果省略 USING 子句,Snowflake 会将条件掩码策略视为正常的 掩码策略。
FORCE
在单个语句中将当前为列设置的掩码或投影策略替换为其他策略。
请注意,将
FORCE
关键字与掩码策略配合使用要求 ALTER TABLE 语句中策略的 数据类型 (即 STRING)与当前在该列上设置的掩码策略的数据类型(即 STRING)相匹配。如果当前没有为该列设置掩码策略,则指定此关键字无效。
使用说明:通用¶
禁止将视图移动到托管访问架构(使用 ALTER VIEW ...RENAME TO 语法),除非 视图所有者(即对视图具有 OWNERSHIP 权限的角色)也拥有目标架构。
对于掩码策略:
USING
子句和FORCE
关键字都是可选的;对列设置掩码策略时,两者都不是必需的。USING
子句和FORCE
关键字可以单独使用,也可以一起使用。有关详细信息,请参阅:可以使用条件列的单个掩码策略应用于多个表,前提是表的列结构与策略中指定的列匹配。
修改具有掩码策略的一个或多个表列,或修改具有行访问策略的表时,请使用 POLICY_CONTEXT 函数模拟对受掩码策略保护的列以及受行访问策略保护的表的查询。
可以将使用条件列的单个掩码策略应用于多个视图,前提是视图的列结构与策略中指定的列匹配。
使用行访问策略:
Snowflake 支持在单个 SQL 语句中添加和删除行访问策略。
例如,若要将已在表上设置的行访问策略替换为其他策略,请先删除行访问策略,然后再添加新的行访问策略。
对于给定资源(即表或视图),要
ADD
或DROP
行访问策略,必须具有架构的 APPLY ROW ACCESS POLICY 权限,或者 资源的 OWNERSHIP 权限,以及行访问策略资源的 APPLY 权限。一个表或视图一次只能由一个行访问策略保护。如果策略正文引用受行访问策略保护的表或视图列或受掩码策略保护的列,则添加策略将失败。
同样,如果掩码策略正文引用受行访问策略或其他掩码策略保护的表,则向表列添加掩码策略将失败。
行访问策略不能应用于系统视图或表函数。
与其他 DROP <object> 操作类似,如果尝试从未添加行访问策略的资源中删除行访问策略,则 Snowflake 会返回错误。
如果对象同时具有行访问策略和一个或多个掩码策略,则首先评估行访问策略。
关于元数据:
注意
客户应确保在使用 Snowflake 服务时,不会将个人数据(用户对象除外)、敏感数据、出口管制数据或其他受监管数据作为元数据输入。有关更多信息,请参阅 Snowflake 中的元数据字段。
使用说明:数据指标函数¶
- 将 DMF 添加到表中:
在将数据指标函数添加到表中之前,您必须:
设置运行数据指标函数的计划。有关详细信息,请参阅 DATA_METRIC_SCHEDULE。
配置事件表以存储调用数据指标函数的结果。有关详细信息,请参阅 查看 DMF 结果。
确保表视图不授权共享,因为不能在共享表或视图上设置数据指标函数。
此外:
您可以向表、视图或物化视图添加数据指标函数。不能对任何其他种类的表(如动态表或外部表)设置数据指标函数。
指定列时,Snowflake 会使用顺序位置。如果在向表或视图中添加数据指标函数后重命名列,则数据指标函数与列的关联仍然有效。
同类数据指标函数中只能添加一个列中。例如,不能两次将 NULL_COUNT 数据指标函数添加到单个列。
如果您在添加引用某列的数据指标函数后删除该列,Snowflake 将无法评估该数据指标函数。
不支持引用虚拟列。
- 从表中删除 DMF:
在使用 DROP FUNCTION 命令从系统中移除数据指标函数之前,请先从表中删除数据指标函数。
您可以使用 DATA_METRIC_FUNCTION_REFERENCES 函数来识别表并查看设置了数据指标函数的对象。
- 计划 DMF
设置完计划后,计划需要十分钟才能生效。
同样,取消设置 DMF 后,计划更改需要十分钟才能生效。有关更多信息,请参阅 计划 DMFs 的运行。
示例¶
将视图 view1
重命名为 view2
:
ALTER VIEW view1 RENAME TO view2;
将视图转换为安全视图:
ALTER VIEW view1 SET SECURE;
将安全视图还原为常规视图:
ALTER VIEW view1 UNSET SECURE;
将列级安全掩码策略应用于视图列:
-- single column ALTER VIEW user_info_v MODIFY COLUMN ssn_number SET MASKING POLICY ssn_mask_v; -- multiple columns ALTER VIEW user_info_v MODIFY COLUMN ssn_number SET MASKING POLICY ssn_mask_v , COLUMN dob SET MASKING POLICY dob_mask_v ;
从视图列中取消设置列级安全掩码策略:
-- single column ALTER VIEW user_info_v modify column ssn_number unset masking policy; -- multiple columns ALTER VIEW user_info_v modify column ssn_number unset masking policy , column dob unset masking policy ;
以下示例在视图上添加行访问策略。设置策略后,可以通过检查 Information Schema 进行验证。
alter view v1 add row access policy rap_v1 on (empl_id);
以下示例从视图中删除行访问策略。通过查询 Information Schema 来验证策略是否已删除。
alter view v1 drop row access policy rap_v1;
以下示例演示如何在视图的单个 SQL 语句中合并添加和删除行访问策略。通过检查 Information Schema 来验证结果。
alter view v1 drop row access policy rap_v1_version_1, add row access policy rap_v1_version_2 on (empl_id);