CREATE DATABASE(目录链接)¶
为使用外部 Iceberg REST 目录的 Apache Iceberg™ 表创建新的 目录链接的数据库。
语法¶
CREATE DATABASE <name>
LINKED_CATALOG = ( catalogParams ),
[ EXTERNAL_VOLUME = '<external_vol>' ]
[ COMMENT = '<string_literal>' ]
[ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
其中:
catalogParams ::= CATALOG = '<catalog_int>', [ ALLOWED_NAMESPACES = ('<namespace1>', '<namespace2>', ... ) ] [ BLOCKED_NAMESPACES = ('<namespace1>', '<namespace2>', ... ) ] [ NAMESPACE_MODE = { IGNORE_NESTED_NAMESPACE | FLATTEN_NESTED_NAMESPACE } ] [ NAMESPACE_FLATTEN_DELIMITER = '<string_literal>' ] [ SYNC_INTERVAL_SECONDS = <value> ]
必填参数¶
name
指定目录链接的数据库的标识符;对于您的账户必须是唯一的。
此外,标识符必须以字母字符开头,且不能包含空格或特殊字符,除非整个标识符字符串放在双引号内(例如,
"My object"
)。放在双引号内的标识符也区分大小写。有关更多信息,请参阅 标识符要求。
可选参数¶
目录参数 (catalogParams)¶
CATALOG = catalog_int
指定您的目录集成的名称。
ALLOWED_NAMESPACES = ('namespace1', 'namespace2', ... )
(可选)在远程目录中指定一个或多个命名空间,以限制自动表发现的范围。Snowflake 同步指定的命名空间,以及所有命名空间和从其衍生的表。如果 ALLOWED_NAMESPACES 列表中有嵌套命名空间,但您将 NAMESPACE_MODE 参数设置为 IGNORE_NESTED_NAMESPACE,则 Snowflake 不会同步嵌套命名空间或其下的任何架构和表。
BLOCKED_NAMESPACES = ('namespace1', 'namespace2', ... )
(可选)在远程目录中指定一个或多个命名空间,以进行自动表发现。
Snowflake 屏蔽指定的命名空间,以及所有命名空间和从其衍生的表。
如果同时指定 ALLOWED_NAMESPACES 和 BLOCKED_NAMESPACES,则 BLOCKED_NAMESPACES 列表优先。例如,如果允许
ns1.ns2
但ns1
被屏蔽,则 Snowflake 将无法同步ns1.ns2
。NAMESPACE_MODE = { IGNORE_NESTED_NAMESPACE | FLATTEN_NESTED_NAMESPACE }
指定 Snowflake 如何处理与目录链接的数据库中 Iceberg 表的命名空间。
IGNORE_NESTED_NAMESPACE
:Snowflake 仅链接您目录的第一个命名空间级别中的表。FLATTEN_NESTED_NAMESPACE
:Snowflake 链接您目录的所有命名空间级别中的表。对于嵌套命名空间中的表,Snowflake 使用 NAMESPACE_FLATTEN_DELIMITER 参数来构建扁平化命名空间。使用此选项时,必须设置 NAMESPACE_FLATTEN_DELIMITER 参数。例如,假设在命名空间
namespace3aa
中有一个名为iceberg_table_5
的表:my_catalog_linked_db |-- namespace3 | |-- namespace3a | |-- namespace3aa | |-- iceberg_table_5
如果设置
NAMESPACE_FLATTEN_DELIMITER = "/"
,则可以指定"my_catalog_linked_db"."namespace3/namespace3a/namespace3aa"."iceberg_table_5"
以引用该表。
默认值:
IGNORE_NESTED_NAMESPACE
NAMESPACE_FLATTEN_DELIMITER = 'string_literal'
如果设置 NAMESPACE_MODE = FLATTEN_NESTED_NAMESPACE,则为必需项。指定分隔符,Snowflake 使用该分隔符为目录中的表构建扁平化命名空间。
重要
您为分隔符选择的字符无法出现在远程命名空间中。在自动发现过程中,Snowflake 会跳过任何包含分隔符的命名空间,并且不会在您的目录链接的数据库中创建相应的架构。
有效字符:Snowflake 标识符 中允许的任何字符。
SYNC_INTERVAL_SECONDS = 'value'
指定 Snowflake 在远程目录中自动发现架构和表时应使用的时间间隔(以秒为单位)。
值:30 到 86400(1 天),含这两个值
默认值:30 秒
访问控制要求¶
权限 |
对象 |
备注 |
---|---|---|
CREATE DATABASE |
账户 |
创建新数据库时需要。 Only the SYSADMIN role, or a higher role, has this privilege by default. The privilege can be granted to additional roles as needed. |
USAGE |
外部卷 |
需要引用现有的外部卷。 |
USAGE |
目录集成 |
需要引用现有目录集成。 |
有关创建具有指定权限集的自定义角色的说明,请参阅 创建自定义角色。
使用说明¶
仅当您使用 Iceberg REST 的目录集成(例如 Snowflake Open Catalog)时才支持。
计费:在预览期间,Snowflake 不对目录链接的数据库计费。计费从 2025 年 9 月 1 日开始。为了帮助您预览成本,METERING_HISTORY 和 METERING_DAILY_HISTORY 视图将在计费开始之前,显示用于目录链接的数据库的 Credit。
要将自动表发现限制为一组特定的命名空间,请使用 ALLOWED_NAMESPACES 参数。您也可以使用 BLOCKED_NAMESPACES 参数来屏蔽一组命名空间。
Snowflake 不同步远程目录访问控制(用户或角色)。
您可以在目录链接的数据库中创建架构或外部管理的 Iceberg 表。目前不支持创建其他 Snowflake 对象。
延迟:
对于链接到远程目录中 7,500 个命名空间的数据库,发现命名空间和表大约需要一小时。
对于包含 500,000 个表的远程目录,自动刷新过程大约需要一小时才能完成。对于具有不同延迟要求的命名空间,我们建议您创建单独的目录链接的数据库。每个数据库都应引用具有相应自动刷新间隔 (REFRESH_INTERVAL_SECONDS) 的目录集成。
对于目录链接的数据库中的 Iceberg 表:
Snowflake 不复制远程目录表属性(例如保留策略或缓冲区),并且目前不支持更改表属性。
默认情况下,自动刷新 处于启用状态。如果外部表的
table-uuid
和目录链接的数据库表不匹配,则刷新失败,Snowflake 将该表从目录链接的数据库中删除;Snowflake 不会更改远程表。如果您从远程目录中删除表,Snowflake 会将该表从目录链接的数据库中删除。此操作是异步进行的,因此您可能不会立即在远程目录中看到更改。
如果您重命名远程目录中的表,Snowflake 会从目录链接的数据库中删除现有表,并使用新名称创建一个表。
支持掩码策略和标签。不支持其他特定于 Snowflake 的功能,包括复制、克隆和共享。
您为 NAMESPACE_FLATTEN_DELIMITER 参数选择的字符不会出现在远程命名空间中。在自动发现过程中,Snowflake 会跳过任何包含分隔符的命名空间,并且不会在您目录链接的数据库中创建相应的架构。
如果为 NAMESPACE_FLATTEN_DELIMITER 参数指定
_
、$
、大写字母或数字以外的任何值,则在查询表时必须将架构名称放在引号中。对于链接到 AWS Glue 的数据库,必须使用小写字母,并将架构、表和列名称用双引号引起来。对于其他仅支持小写标识符的 Iceberg REST 目录,这也是必需的。
以下示例显示了有效查询:
CREATE SCHEMA “s1”;
以下语句无效,因为它们使用大写字母或省略了双引号:
CREATE SCHEMA s1; CREATE SCHEMA "Schema1";
不支持使用 UNDROP ICEBERG TABLE。
使用外部卷的表支持与列表共享。目前不支持直接共享。
写入目录链接的数据库中的表:
不支持已售凭据。
目前不支持写入嵌套命名空间中的表。
对于 ALLOWED_NAMESPACES 和 BLOCKED_NAMESPACES,如果集合已经包含父命名空间,则 Snowflake 不会存储嵌套命名空间。例如,如果您创建数据库并指定
ALLOWED_NAMESPACES = ('ns1', 'ns1.ns2', 'ns1.ns3')
,Snowflake 仅存储ns1
,因为另外两个会自动包含在内。如果您在示例数据库上使用 GET_DDL,Snowflake 将返回ALLOWED_NAMESPACES = ('ns1')
。这同样适用于 BLOCKED_NAMESPACES。查询目录链接的数据库中的表:
Snowflake 会自动将未加引号的标识符(表名和列名)转换为大写。如果您的外部 Iceberg 目录使用区分大小写的标识符,则必须用双引号将表名和列名引起来。
有关对象标识符的更多信息,请参阅 标识符要求。
关于元数据:
注意
客户应确保在使用 Snowflake 服务时,不会将个人数据(用户对象除外)、敏感数据、出口管制数据或其他受监管数据作为元数据输入。有关更多信息,请参阅 Snowflake 中的元数据字段。
示例¶
使用扁平嵌套命名空间创建目录链接的数据库。
CREATE DATABASE my_linked_db
LINKED_CATALOG = (
CATALOG = 'my_catalog_int',
NAMESPACE_MODE = FLATTEN_NESTED_NAMESPACE,
NAMESPACE_FLATTEN_DELIMITER = '-'
)
EXTERNAL_VOLUME = 'my_external_vol';
创建一个目录链接的数据库,该数据库使用已售凭据并指定一个允许的命名空间:
CREATE DATABASE my_linked_db
LINKED_CATALOG = (
CATALOG = 'my_catalog_int_vended_creds',
ALLOWED_NAMESPACES = ('my_namespace')
);