ALTER VIEW

修改现有视图的属性。目前唯一支持的操作是:

  • 重命名视图。

  • 转换为安全视图(或从安全视图恢复)。

  • 添加、覆盖、删除视图的注释。

请注意,不能 使用此命令更改视图的定义。要更改视图定义,必须删除该视图,然后重新创建该视图。

另请参阅:

CREATE VIEWDROP VIEWSHOW VIEWSDESCRIBE VIEW

语法

ALTER VIEW [ IF EXISTS ] <name> RENAME TO <new_name>

ALTER VIEW [ IF EXISTS ] <name> SET
  [ SECURE ]
  [ CHANGE_TRACKING =  { TRUE | FALSE } ]
  [ CONTACT <purpose> = <contact_name> [ , <purpose> = <contact_name> ... ] ]
  [ COMMENT = '<string_literal>' ]

ALTER VIEW [ IF EXISTS ] <name> UNSET
  [ SECURE ]
  [ CONTACT <purpose> ]
  [ COMMENT = '<string_literal>' ]

ALTER VIEW <name> dataMetricFunctionAction

ALTER VIEW [ IF EXISTS ] <name> dataGovnPolicyTagAction
Copy

其中:

dataMetricFunctionAction ::=

    SET DATA_METRIC_SCHEDULE = {
        '<num> MINUTE'
      | 'USING CRON <expr> <time_zone>'
      | 'TRIGGER_ON_CHANGES'
    }

  | UNSET DATA_METRIC_SCHEDULE

  | { ADD | DROP } DATA METRIC FUNCTION <metric_name>
      ON ( <col_name> [ , ... ] [ , TABLE <table_name>( <col_name> [ , ... ] ) ] )
      [ EXPECTATION <expectation_name> ( <expression> )
        [, <expectation_name> ( <expression> ) [ , ... ] ] ]
      [ EXECUTE AS ROLE <role_name> ]
      [ , <metric_name_2> ON ( <col_name> [ , ... ] [ , TABLE <table_name>( <col_name> [ , ... ] ) ] ) ]
        [ EXPECTATION <expectation_name> ( <expression> )
          [, <expectation_name> ( <expression> ) [ , ... ] ] ]
        [ EXECUTE AS ROLE <role_name> ]

  | MODIFY DATA METRIC FUNCTION <metric_name>
      ON ( <col_name> [ , ... ] [ , TABLE <table_name>( <col_name> [ , ... ] ) ] )
        { SUSPEND | RESUME }
      [ , <metric_name_2> ON ( <col_name> [ , ... ] [ , TABLE <table_name>( <col_name> [ , ... ] ) ] )
        { SUSPEND | RESUME } ]

  | MODIFY DATA METRIC FUNCTION <metric_name>
      ON ( <col_name> [ , ... ] [ , TABLE <table_name>( <col_name> [ , ... ] ) ] )
      { ADD | MODIFY } EXPECTATION <expectation_name> ( <expression> )
          [, <expectation_name> ( <expression> ) [ , ... ] ]

  | MODIFY DATA METRIC FUNCTION <metric_name>
      ON ( <col_name> [ , ... ] [ , TABLE <table_name>( <col_name> [ , ... ] ) ] )
      DROP EXPECTATION <expectation_name> [ , <expectation_name> [ , ... ] ]
Copy
dataGovnPolicyTagAction ::=
  {
      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>
        [ ENTITY KEY ( <col_name> [, ... ] ) ]
        [ FORCE ]
    | UNSET AGGREGATION POLICY
  }
  |
  {
      SET JOIN POLICY <policy_name>
        [ FORCE ]
    | UNSET JOIN 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> ... ]
Copy

参数

name

指定要更改的视图的标识符。如果标识符包含空格或特殊字符,则整个字符串必须放在双引号内。放在双引号内的标识符也区分大小写。

RENAME TO new_name

指定视图的新标识符;对于架构必须是唯一的。

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

可以将对象移动到其他数据库和/或架构,同时选择重命名对象。为此,请指定一个限定 new_name 值,该值分别以 db_name.schema_name.object_nameschema_name.object_name 的形式包含新数据库和/或架构名称。

备注

  • 目标数据库和/或架构必须已存在。此外,新位置中不能存在同名对象;否则,该语句将返回错误。

  • 除非 对象所有者(即拥有对象 OWNERSHIP 权限的角色)也拥有目标架构,否则禁止将对象移动到托管访问架构。

重命名对象时,引用该对象的其他对象必须使用新名称进行更新。

SET ...

指定要为视图设置的属性:

SECURE

将视图指定为安全视图。

CHANGE_TRACKING = TRUE | FALSE

指定对表启用或禁用变更跟踪。

  • TRUE 对视图启用更改跟踪,并将设置级联到所有基础表。

  • FALSE 对视图禁用更改跟踪,并将设置级联到所有基础表。

CONTACT purpose = contact [ , purpose = contact ... ]

将现有对象与一个或多个 联系人 关联起来。

您不能在同一语句中使用其他属性设置 CONTACT 属性。

COMMENT = 'string_literal'

为视图添加注释或覆盖现有注释。

备注

必须单独设置每个视图属性。

UNSET ...

指定要为视图取消设置的属性,这会将其重置为默认值:

  • SECURE

  • CONTACT purpose

  • COMMENT

重置属性时,请仅指定名称;指定属性的值将返回错误。

备注

必须单独重置每个视图属性。

数据指标函数操作 (dataMetricFunctionAction)

DATA_METRIC_SCHEDULE ...

指定定期运行数据指标函数的计划。

'num MINUTE'

指定在两次运行数据指标函数之间插入的等待时间间隔(以分钟为单位)。仅接受正整数。

还支持 num M 语法。

对于数据指标函数,使用以下值之一:51530607201440

'USING CRON expr time_zone'

指定用于定期运行数据指标函数的 cron 表达式和时区。支持标准 cron 实用程序语法的子集。

有关时区列表,请参阅 ` tz 数据库时区列表 <https://en.wikipedia.org/wiki/List_of_tz_database_time_zones (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)
# | | | | |
# | | | | |
  * * * * *
Copy

支持以下特殊字符:

*

通配符。指定字段的任何出现。

L

代表“last”。在星期几字段中使用时,它允许您指定结构,例如给定月份的“最后一个星期五”(“5L”)。在日期字段中,它指定该月的最后一天。

/{n}

指示给定时间单位的第 n 个实例。每个时间量子都是独立计算的。例如,如果在月份字段中指定 4/3,则数据指标函数将安排在 4 月、7 月和 10 月执行(即从一年中的第 4 个月开始,每 3 个月一次)。在随后的几年中保持相同的计划。也就是说,数据指标函数 不会 安排在 1 月(10 月运行后 3 个月)运行。

备注

  • cron 表达式当前仅根据指定的时区进行计算。更改账户的 TIMEZONE 参数值(或在用户或会话级别设置该值):emph:不会 更改数据指标函数的时区。

  • cron 表达式定义数据指标函数的所有 有效 运行时间。Snowflake 尝试根据此计划运行数据指标函数;但是,如果在下一个有效运行时间开始之前未完成上一次运行,则跳过任何有效运行时间。

  • 当 cron 表达式中同时包含一个月中的特定日期和一周中的某一天时,数据指标函数将安排在满足一个月中某一天条件 一周中某一天条件的日期运行。例如,DATA_METRIC_SCHEDULE = 'USING CRON 0 0 10-20 * TUE,THU UTC' 计划在每月的 10 号到 20 号以及这些日期之外的任何星期二或星期四的 0AM 运行数据指标函数。

  • cron 中最短的时间粒度为分钟。

    如果数据指标函数在其 cron 表达式中定义的分钟内恢复,则该数据指标函数的第一次计划运行就是 cron 表达式实例的下一次出现。例如,如果计划在每天午夜 (USING CRON 0 0 * * *) 运行的数据指标函数在午夜过后 5 秒 (00:00:05) 恢复,则第一次数据指标函数运行将在下一个午夜开始。

'TRIGGER_ON_CHANGES'

指定 DMF 在 DML 操作 修改表(例如插入新行或删除行)时运行。

您可以为以下对象指定 'TRIGGER_ON_CHANGES'

  • 动态表

  • 外部表

  • Apache Iceberg™ 表

  • 常规表

  • 临时表

  • 瞬态表

您不能为视图指定 'TRIGGER_ON_CHANGES'

重聚类,对表进行的更改不会触发 DMF 运行。

{ ADD | DROP } DATA METRIC FUNCTION metric_name

要添加到表或视图中或从表或视图中删除的数据指标函数的标识符。

ON ( col_name [ , ... ] [ , TABLE( table_name( col_name [ , ... ] ) ) ] )

要关联数据指标函数的表或视图列。列的数据类型必须与数据指标函数定义中指定的列的数据类型相匹配。

如果数据指标函数接受第二个表作为实参,请指定表及其列的完全限定名称。

EXPECTATION expectation_name ( expression ) [, expectation_name ( expression ) [ , ... ] ]

为列与 DMF 之间的关联定义一个或多个 期望值

[ , metric_name_2 ON ( col_name [ , ... ] [ , TABLE( table_name( col_name [ , ... ] ) ) ] ) ]

要添加到表或视图中的其他数据指标函数。使用逗号分隔每个数据指标函数及其指定列。

如果数据指标函数接受第二个表作为实参,请指定表及其列的完全限定名称。

EXECUTE AS ROLE role_name

指定 DMF 使用哪个角色运行。角色必须对表或视图拥有 SELECT 权限。

有关更多信息,请参阅 表或视图所需的权限

MODIFY DATA METRIC FUNCTION metric_name

要修改的数据指标函数的标识符。

ON ( col_name [ , ... ] [ , TABLE( table_name( col_name [ , ... ] ) ) ] )

指定与数据指标函数相关联的列。 如果数据指标函数接受第二个表作为实参,请指定表及其列的完全限定名称。

{ SUSPEND | RESUME }

在指定列上暂停或恢复数据指标函数。当为表或视图设置数据指标函数时,数据指标函数会自动包含在计划中。

  • SUSPEND 从计划中移除数据指标函数。

  • RESUME 将暂停的数据指标函数重新纳入计划。

{ ADD | MODIFY } EXPECTATION expectation_name ( expression ) [, expectation_name ( expression ) [ , ... ] ]

为列与 DMF 之间的关联定义或修改一个或多个 期望值

DROP EXPECTATION expectation_name [ , expectation_name [ , ... ] ]

从列与 DMF 之间的关联中移除指定的期望值。

[ , metric_name_2 ON ( col_name [ , ... ] [ , TABLE(col_name [ , ... ] ) ] ) ]

要修改的其他数据指标函数。使用逗号分隔每个数据指标函数及其指定列。如果数据指标函数接受第二个表作为实参,请指定表及其列的完全限定名称。

数据治理策略和标签操作 (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

Drops all row access policy associations from the table.

在从事件表中删除策略 之前,从架构中删除行访问策略时,此表达式非常有用。使用此表达式从表中删除行访问策略关联。

假设在创建快照时对表应用了行访问策略,之后该策略被删除了。从 快照 恢复表后,除非运行带 DROP ALL ROW ACCESS POLICIES 子句的 ALTER TABLE 命令,否则无法对其进行查询。

SET AGGREGATION POLICY policy_name
[ ENTITY KEY (col_name [ , ... ]) ] [ FORCE ]

为该表分配 聚合策略

使用可选的 ENTITY KEY 参数来定义表中哪些列可以唯一地标识实体。有关更多信息,请参阅 通过聚合策略实施实体级隐私

使用可选 FORCE 参数以原子方式将现有聚合策略替换为新的聚合策略。

UNSET AGGREGATION POLICY

从表中分离聚合策略。

SET JOIN POLICY policy_name
[ FORCE ]

为表分配 联接策略

使用可选 FORCE 参数以原子方式将现有联接策略替换为新的联接策略。

UNSET JOIN POLICY

从表中分离联接策略。

{ ALTER | MODIFY } [ COLUMN ] ...
USING ( col_name , cond_col_1 ... )

指定要传递到条件掩码策略 SQL 表达式的实参。

列表中的第一列指定用于掩码处理或标记数据的策略条件的列,并且 必须 与设置掩码策略的列匹配。

附加列指定要评估的列,以确定在对第一列进行查询时是否对查询结果的每行中的数据进行掩码处理或标记化。

如果省略 USING 子句,Snowflake 会将条件掩码策略视为正常的 掩码策略

FORCE

在单个语句中将当前为列设置的掩码或投影策略替换为其他策略。

请注意,将 FORCE 关键字与掩码策略配合使用要求 ALTER TABLE 语句中策略的 :doc:` 数据类型 </sql-reference-data-types>`(即 STRING)与当前在该列上设置的掩码策略的数据类型(即 STRING)相匹配。

如果当前没有为该列设置掩码策略,则指定此关键字无效。

有关详细信息,请参阅:替换列上的掩码策略替换投影策略

使用说明:通用

  • 禁止将视图移动到托管访问架构(使用 ALTER VIEW ...RENAME TO 语法),除非 视图所有者(即对视图具有 OWNERSHIP 权限的角色)也拥有目标架构。

  • 对于掩码策略:

    • USING 子句和 FORCE 关键字都是可选的;对列设置掩码策略时,两者都不是必需的。USING 子句和 FORCE 关键字可以单独使用,也可以一起使用。有关详细信息,请参阅:

    • 可以使用条件列的单个掩码策略应用于多个表,前提是表的列结构与策略中指定的列匹配。

    • 修改具有掩码策略的一个或多个表列,或修改具有行访问策略的表时,请使用 POLICY_CONTEXT 函数模拟对受掩码策略保护的列以及受行访问策略保护的表的查询。

  • 可以将使用条件列的单个掩码策略应用于多个视图,前提是视图的列结构与策略中指定的列匹配。

  • 使用行访问策略:

    • Snowflake 支持在单个 SQL 语句中添加和删除行访问策略。

      例如,若要将已在表上设置的行访问策略替换为其他策略,请先删除行访问策略,然后再添加新的行访问策略。

    • 对于给定资源(即表或视图),要 ADDDROP 行访问策略,必须具有架构的 APPLY ROW ACCESS POLICY 权限,或者 资源的 OWNERSHIP 权限,以及行访问策略资源的 APPLY 权限。

    • 一个表或视图一次只能由一个行访问策略保护。如果策略正文引用受行访问策略保护的表或视图列或受掩码策略保护的列,则添加策略将失败。

      同样,如果掩码策略正文引用受行访问策略或其他掩码策略保护的表,则向表列添加掩码策略将失败。

    • 行访问策略不能应用于系统视图或表函数。

    • 与其他 DROP <object> 操作类似,如果尝试从未添加行访问策略的资源中删除行访问策略,则 Snowflake 会返回错误。

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

  • 关于元数据:

    注意

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

使用说明:数据指标函数

将 DMF 添加到表中:

在将数据指标函数添加到表中之前,您必须:

  • 设置运行数据指标函数的计划。有关详细信息,请参阅 DATA_METRIC_SCHEDULE

  • 配置事件表以存储调用数据指标函数的结果。有关详细信息,请参阅 查看数据指标函数的结果

  • 确保表视图不授权共享,因为不能在共享表或视图上设置数据指标函数。

此外:

  • 可以向表、外部表、视图或物化视图添加数据指标函数。不能对任何其他种类的表(如动态表)设置数据指标函数。

  • 指定列时,Snowflake 会使用顺序位置。如果在向表或视图中添加数据指标函数后重命名列,则数据指标函数与列的关联仍然有效。

  • 同类数据指标函数中只能添加一个列中。例如,不能两次将 NULL_COUNT 数据指标函数添加到单个列。

  • 如果您在添加引用某列的数据指标函数后删除该列,Snowflake 将无法评估该数据指标函数。

  • 不支持引用虚拟列。

计划 DMF

设置完计划后,计划需要十分钟才能生效。

同样,取消设置 DMF 后,计划更改需要十分钟才能生效。有关更多信息,请参阅 计划 DMF 运行

示例

将视图 view1 重命名为 view2

ALTER VIEW view1 RENAME TO view2;
Copy

将视图转换为安全视图:

ALTER VIEW view1 SET SECURE;
Copy

将安全视图还原为常规视图:

ALTER VIEW view1 UNSET SECURE;
Copy

将列级安全掩码策略应用于视图列:

-- 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
  ;
Copy

从视图列中取消设置列级安全掩码策略:

-- 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
  ;
Copy

以下示例在视图上添加行访问策略。在设置策略后,您可以通过检查 信息架构 来验证其引用的对象。

ALTER VIEW v1
  ADD ROW ACCESS POLICY rap_v1 ON (empl_id);
Copy

以下示例从视图中删除行访问策略。通过查询 Information Schema 来验证策略是否已删除。

ALTER VIEW v1
  DROP ROW ACCESS POLICY rap_v1;
Copy

以下示例演示如何在视图的单个 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);
Copy

以下示例在视图上设置了 联接策略

ALTER VIEW join_view
  SET JOIN POLICY jp1;
Copy
语言: 中文