ALTER EXTERNAL TABLE

修改现有外部表的属性、列或约束条件。

另请参阅:

CREATE EXTERNAL TABLEDROP EXTERNAL TABLESHOW EXTERNAL TABLESDESCRIBE EXTERNAL TABLE

语法

ALTER EXTERNAL TABLE [ IF EXISTS ] <name> REFRESH [ '<relative-path>' ]

ALTER EXTERNAL TABLE [ IF EXISTS ] <name> ADD FILES ( '<path>/[<filename>]' [ , '<path>/[<filename>'] ] )

ALTER EXTERNAL TABLE [ IF EXISTS ] <name> REMOVE FILES ( '<path>/[<filename>]' [ , '<path>/[<filename>]' ] )

ALTER EXTERNAL TABLE [ IF EXISTS ] <name> SET
  [ AUTO_REFRESH = { TRUE | FALSE } ]
Copy

手动添加和移除的分区

ALTER EXTERNAL TABLE <name> [ IF EXISTS ] ADD PARTITION ( <part_col_name> = '<string>' [ , <part_col_name> = '<string>' ] ) LOCATION '<path>'

ALTER EXTERNAL TABLE <name> [ IF EXISTS ] DROP PARTITION LOCATION '<path>'
Copy

参数

name

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

REFRESH [ 'relative-path' ]

访问外部表定义中引用的暂存数据文件,并更新表元数据:

  • 路径中的新文件将添加到表元数据中。

  • 对路径中文件的更改将在表元数据中更新。

  • 路径中不再存在的文件将从表元数据中移除。

(可选)指定相对路径以刷新数据文件的特定子集的元数据。

创建外部表时,只需使用此参数一次。此步骤将元数据与暂存区中最新的关联文件集和外部表定义中的路径进行同步。此外,此步骤确保外部表可以读取指定暂存区和路径中的数据文件,并且外部表定义中没有缺失任何文件。

备注

  • 在对象所有者手动添加分区时(即,在 PARTITION_TYPE = USER_SPECIFIED 时),已分区的外部表 支持此参数。

  • 如果在外部表上设置了 TABLE_FORMAT = DELTA,则 REFRESH 支持使用相对路径刷新数据文件的特定子集的元数据。

ADD FILES

使用外部表元数据注册以逗号分隔的指定文件列表,并刷新表。对于每个文件,列出相对于外部表定义中 [ WITH ] LOCATION 的路径和文件名。有关信息,请参阅 CREATE EXTERNAL TABLE

在对象所有者手动添加分区时(即,在 PARTITION_TYPE = USER_SPECIFIED 时),已分区的外部表 支持此参数。

REMOVE FILES

从外部表元数据注销以逗号分隔的指定文件列表,并刷新表。对于每个文件,列出相对于外部表定义中 [ WITH ] LOCATION 的路径和文件名。有关更多信息,请参阅 CREATE EXTERNAL TABLE

在对象所有者手动添加分区时(即,在 PARTITION_TYPE = USER_SPECIFIED 时),已分区的外部表 支持此参数。

SET ...

指定要为外部表设置的一个或多个属性/参数(即用空格、逗号或换行符分隔):

AUTO_REFRESH = TRUE | FALSE

指定当 新的或更新的 数据文件在 [ WITH ] LOCATION = 设置中指定的命名外部暂存区中可用时,Snowflake 是否应允许触发外部表元数据的自动刷新。

备注

TRUE

Snowflake 支持触发外部表元数据的自动刷新。

FALSE

Snowflake 不支持触发外部表元数据的自动刷新。您必须使用 ALTER EXTERNAL TABLE ... REFRESH 定期手动刷新外部表元数据,以使元数据与暂存区路径中的当前文件列表同步。

默认:TRUE

手动添加和移除的分区

当外部表的分区类型由用户指定时(即,PARTITION_TYPE = USER_SPECIFIED),使用以下参数添加或移除分区:

ADD PARTITION ( <part_col_name> = '<string>' [ , <part_col_name> = '<string>' , ... ] ) LOCATION '<path>'

在指定位置(即路径)中,为一个或多个为外部表定义的分区列手动添加分区。

备注

用户指定的分区列名的最大长度为 32 个字符。

添加分区时,还会将该位置中的任何新文件或已更新的文件添加到外部表元数据中。

DROP PARTITION LOCATION '<path>'

手动删除指定位置(即路径)中的所有分区。

删除分区时,还会从外部表元数据中移除该位置中的任何文件。

访问控制要求

用于执行此操作的 角色 必须至少具有以下 权限

权限

对象

备注

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

暂存区

需要此权限才能手动刷新外部表元数据。

USAGE

文件格式

需要此权限才能手动刷新外部表元数据。

Operating on an object in a schema requires at least one privilege on the parent database and at least one privilege on the parent schema.

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

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

使用说明

  • 只有外部表所有者(对外部表具有 OWNERSHIP 权限的角色)或更高级别的角色才能执行此命令。

  • 以下命令可用于显式事务(使用 BEGIN ... COMMIT):

    • ALTER EXTERNAL TABLE ... REFRESH

    • ALTER EXTERNAL TABLE ... ADD FILES

    • ALTER EXTERNAL TABLE ... REMOVE FILES

    通过使用显式事务,可以在手动替换外部表元数据中的已更新文件时确保状态一致。

  • 使用以下语法在外部表中添加或移除列:

    添加列:
    ALTER TABLE <name> ADD COLUMN ( <col_name> <col_type> AS <expr> ) [, ...]
    
    Copy
    重命名列:
    ALTER TABLE <name> RENAME COLUMN <col_name> to <new_col_name>
    
    Copy
    删除列:
    ALTER TABLE <name> DROP COLUMN <col_name>
    
    Copy

    备注

    无法删除默认的 VALUE 和 METADATA$FILENAME 列。

    有关示例,请参阅 ALTER TABLE 主题。

  • 要在外部表上添加和删除行访问策略,或者设置或取消设置标签,请使用 ALTER TABLE 命令。

    但是,您可以创建具有行访问策略和标签的外部表。有关更多信息,请参阅 CREATE EXTERNAL TABLE

  • 您可以通过执行 ALTER TABLE 命令来对外部表使用数据指标函数。有关更多信息,请参阅 使用数据指标函数执行数据质量检查

  • 关于元数据:

    注意

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

示例

手动刷新元数据

根据引用的数据文件中的变更,手动刷新整个外部表元数据集:

ALTER EXTERNAL TABLE exttable_json REFRESH;
Copy

与第一个示例类似,但仅手动刷新外部表的元数据路径:

CREATE OR REPLACE STAGE mystage
  URL='<cloud_platform>://twitter_feed/logs/'
  .. ;

-- Create the external table
-- 'daily' path includes paths in </YYYY/MM/DD/> format
CREATE OR REPLACE EXTERNAL TABLE daily_tweets
  WITH LOCATION = @twitter_feed/daily/;

-- Refresh the metadata for a single day of data files by date
ALTER EXTERNAL TABLE exttable_part REFRESH '2018/08/05/';
Copy

手动添加或移除文件

将文件的显式列表添加到外部表元数据中:

ALTER EXTERNAL TABLE exttable1 ADD FILES ('path1/sales4.json.gz', 'path1/sales5.json.gz');
Copy

从外部表元数据中移除文件的显式列表:

ALTER EXTERNAL TABLE exttable1 REMOVE FILES ('path1/sales4.json.gz', 'path1/sales5.json.gz');
Copy

在显式事务中,将外部表元数据中的 2019 年 12 月日志文件替换为经更新的日志文件:

BEGIN;

ALTER EXTERNAL TABLE extable1 REMOVE FILES ('2019/12/log1.json.gz');

ALTER EXTERNAL TABLE extable1 ADD FILES ('2019/12/log1.json.gz');

COMMIT;
Copy

手动添加或移除分区

在分区列的指定位置手动添加分区:

ALTER EXTERNAL TABLE et2 ADD PARTITION(col1='2022-01-24', col2='a', col3='12') LOCATION '2022/01';
Copy

Snowflake 将分区添加到外部表的元数据中。该操作还会将指定位置的任何新数据文件添加到元数据中。

从指定位置手动移除分区:

ALTER EXTERNAL TABLE et2 DROP PARTITION LOCATION '2022/01';
Copy

Snowflake 从外部表的元数据中移除分区。该操作还会从元数据中移除指定位置的任何数据文件。

语言: 中文