ALTER 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 }
手动添加和移除的分区
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>'
参数¶
name
要更改的外部表的标识符。如果标识符包含空格或特殊字符,则整个字符串必须放在双引号内。放在双引号内的标识符也区分大小写。
REFRESH [ 'relative-path' ]
访问外部表定义中引用的暂存数据文件,并更新表元数据:
路径中的新文件将添加到表元数据中。
对路径中文件的更改将在表元数据中更新。
路径中不再存在的文件将从表元数据中移除。
(可选)指定相对路径以刷新数据文件的特定子集的元数据。
创建外部表时,只需使用此参数一次。此步骤将元数据与暂存区中最新的关联文件集和外部表定义中的路径进行同步。此外,此步骤确保外部表可以读取指定暂存区和路径中的数据文件,并且外部表定义中没有缺失任何文件。
备注
在对象所有者手动添加分区时(即在
PARTITION_TYPE = USER_SPECIFIED
时),已分区的外部表 不 支持此参数。如果在外部表上设置了
TABLE_FORMAT = DELTA
,则REFRESH
不 支持使用相对路径刷新数据文件的特定子集的元数据。
ADD FILES
将指定的逗号分隔文件列表添加到外部表元数据中。通常,
ADD FILES
和REMOVE FILES
参数用于手动刷新外部表元数据(即当AUTO_REFRESH = FALSE
时)。文件引用在外部表定义中表示为相对于 [ WITH ] LOCATION 的路径。有关信息,请参阅 CREATE EXTERNAL TABLE。列出每个文件的路径和文件名。
ALTER EXTERNAL TABLE 语句会自动刷新外部表元数据,并添加文件(如果文件在指定的存储位置存在)。
在对象所有者手动添加分区时(即在
PARTITION_TYPE = USER_SPECIFIED
时),已分区的外部表 不 支持此参数。REMOVE FILES
从外部表元数据中移除指定的逗号分隔文件列表。通常,
ADD FILES
和REMOVE FILES
参数用于手动刷新外部表元数据(即当AUTO_REFRESH = FALSE
时)。文件引用在外部表定义中表示为相对于 [ WITH ] LOCATION 的路径。有关信息,请参阅 CREATE EXTERNAL TABLE。列出每个文件的路径和文件名。
ALTER EXTERNAL TABLE 语句会自动刷新外部表元数据并移除文件。
在对象所有者手动添加分区时(即在
PARTITION_TYPE = USER_SPECIFIED
时),已分区的外部表 不 支持此参数。
SET ...
指定要为外部表设置的一个或多个属性/参数(用空格、逗号或换行符分隔):
AUTO_REFRESH = TRUE | FALSE
指定当 新的或更新的 数据文件在
[ WITH ] LOCATION =
设置中指定的命名外部暂存区中可用时,Snowflake 是否应允许触发外部表元数据的自动刷新。备注
必须 为存储位置配置事件通知,以便在可将新的或更新的数据读入外部表元数据时通知 Snowflake。有关更多信息,请参阅云存储服务的说明:
- Amazon S3:
- Google Cloud Storage:
- Microsoft Azure:
在对象所有者手动添加分区时(即在
PARTITION_TYPE = USER_SPECIFIED
时),已分区的外部表 不 支持此参数。如果外部表引用了存储在 :doc:` 与 S3 兼容的外部暂存区 </user-guide/data-load-s3-compatible-storage>` 上的数据文件,则这些表 :emph:` 不 ` 支持将此参数设置为 TRUE。
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 |
文件格式 |
需要此权限才能手动刷新外部表元数据。 |
请注意,对架构中的对象进行操作还需要对父数据库和架构具有 USAGE 权限。
有关创建具有指定权限集的自定义角色的说明,请参阅 创建自定义角色。
使用说明¶
只有外部表所有者(即对外部表具有 OWNERSHIP 权限的角色)或更高级别的角色才能执行此命令。
以下命令可用于显式事务(使用 BEGIN ...:doc:
/sql-reference/sql/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> ) [, ...]
- 重命名列:
ALTER TABLE <name> RENAME COLUMN <col_name> to <new_col_name>
- 删除列:
ALTER TABLE <name> DROP COLUMN <col_name>
备注
无法删除默认的 VALUE 和 METADATA$FILENAME 列。
有关示例,请参阅 ALTER TABLE 主题。
要在外部表上添加和删除行访问策略,或者设置或取消设置标签,请使用 ALTER TABLE 命令。
但是,您可以创建具有行访问策略和标签的外部表。请参阅 CREATE EXTERNAL TABLE。
您可以通过执行 ALTER TABLE 命令来对外部表使用数据指标函数。有关更多信息,请参阅 使用数据指标函数。
关于元数据:
注意
客户应确保在使用 Snowflake 服务时,不会将个人数据(用户对象除外)、敏感数据、出口管制数据或其他受监管数据作为元数据输入。有关更多信息,请参阅 Snowflake 中的元数据字段。
示例¶
手动刷新元数据¶
根据引用的数据文件中的变更,手动刷新整个外部表元数据集:
ALTER EXTERNAL TABLE exttable_json REFRESH;
与第一个示例类似,但仅手动刷新外部表的元数据路径:
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/';
手动添加或移除文件¶
将文件的显式列表添加到外部表元数据中:
ALTER EXTERNAL TABLE exttable1 ADD FILES ('path1/sales4.json.gz', 'path1/sales5.json.gz');
从外部表元数据中移除文件的显式列表:
ALTER EXTERNAL TABLE exttable1 REMOVE FILES ('path1/sales4.json.gz', 'path1/sales5.json.gz');
在显式事务中,将外部表元数据中的 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;
手动添加或移除分区¶
在分区列的指定位置手动添加分区:
ALTER EXTERNAL TABLE et2 ADD PARTITION(col1='2022-01-24', col2='a', col3='12') LOCATION '2022/01';
Snowflake 将分区添加到外部表的元数据中。该操作还会将指定位置的任何新数据文件添加到元数据中。
从指定位置手动移除分区:
ALTER EXTERNAL TABLE et2 DROP PARTITION LOCATION '2022/01';
Snowflake 从外部表的元数据中移除分区。该操作还会从元数据中移除指定位置的任何数据文件。