CREATE DATABASE¶
在系统中创建新数据库。
此外,该命令还可用于:
创建现有数据库的克隆,无论是在其当前状态还是在过去的特定时间/点(使用 Time Travel)。有关克隆数据库的更多信息,请参阅 克隆注意事项。
使用其他 Snowflake 账户提供的共享创建数据库。有关共享的更多信息,请参阅 Secure Data Sharing 简介。
创建现有主数据库的副本(即辅助数据库)。有关 Database Replication 的详细信息,请参阅 跨多个账户的数据库复制简介。
语法¶
标准数据库
CREATE [ OR REPLACE ] [ TRANSIENT ] DATABASE [ IF NOT EXISTS ] <name>
[ CLONE <source_db>
[ { AT | BEFORE } ( { TIMESTAMP => <timestamp> | OFFSET => <time_difference> | STATEMENT => <id> } ) ] ]
[ DATA_RETENTION_TIME_IN_DAYS = <integer> ]
[ MAX_DATA_EXTENSION_TIME_IN_DAYS = <integer> ]
[ EXTERNAL_VOLUME = <external_volume_name> ]
[ CATALOG = <catalog_integration_name> ]
[ DEFAULT_DDL_COLLATION = '<collation_specification>' ]
[ COMMENT = '<string_literal>' ]
[ [ WITH ] TAG ( <tag_name> = '<tag_value>' [ , <tag_name> = '<tag_value>' , ... ] ) ]
共享数据库(来自共享)
CREATE DATABASE <name> FROM SHARE <provider_account>.<share_name>
辅助数据库 (Database Replication)
CREATE DATABASE <name>
AS REPLICA OF <account_identifier>.<primary_db_name>
[ DATA_RETENTION_TIME_IN_DAYS = <integer> ]
必填参数¶
name
指定数据库的标识符;对于您的账户必须是唯一的。
此外,标识符必须以字母字符开头,且不能包含空格或特殊字符,除非整个标识符字符串放在双引号内(例如,
"My object"
)。放在双引号内的标识符也区分大小写。有关更多详细信息,请参阅 标识符要求。
重要
作为 :doc:` Database Replication 和故障转移 </user-guide/db-replication-intro>` 的最佳实践,我们建议为每个辅助数据库提供与其主数据库相同的名称。此实践支持同一数据库中的其他对象引用完全限定对象(即 :code:` '<db>.<schema>.<object>' `),例如在视图中查询完全限定表名。
如果辅助数据库的名称与主数据库的名称不同,则这些对象引用将在辅助数据库中中断。
Secure Data Sharing 参数¶
provider_account.share_name
指定从中创建数据库的 共享 的标识符。根据文件规定,共享的名称必须与提供该共享的账户的名称完全一致。
Database Replication 实参¶
AS REPLICA OF account_identifier.primary_db_name
指定要从中创建副本(即辅助数据库)的主数据库的标识符。如果标识符包含空格、特殊字符或大小写混合字符,则整个字符串必须放在双引号内。
需要主数据库的账户标识符和名称。
account_identifier
存储主数据库的账户的唯一标识符。首选标识符为
organization_name.account_name
。若要查看组织中已启用复制的账户列表,请查询 SHOW REPLICATION ACCOUNTS。虽然旧版账户定位器也可以用作账户标识符,但不建议使用,因为旧版账户定位器未来可能无法运行。有关使用账户定位器作为账户标识符的更多详细信息,请参阅 Database Replication 使用说明。
primary_db_name
主数据库的名称。作为最佳实践,我们建议为每个辅助数据库提供与其主数据库相同的名称。
备注
作为 Database Replication 和故障转移的最佳实践,我们建议将辅助数据库上的可选参数 DATA_RETENTION_TIME_IN_DAYS 设置为与主数据库上相同的值。
可选参数¶
TRANSIENT
将数据库指定为瞬态的。瞬态数据库没有故障安全期,因此一旦它们离开 Time Travel,它们就不会产生额外的存储成本;但是,这意味着它们在数据丢失时也不会受故障安全的保护。有关更多信息,请参阅 了解和查看故障安全。
此外,根据定义,在瞬态数据库中创建的所有架构(以及所有表)都是瞬态的。有关瞬态表的更多信息,请参阅 CREATE TABLE。
默认:无值(即数据库是永久性的)
CLONE source_db
指定创建指定的源数据库的克隆。有关克隆数据库的更多详细信息,请参阅 CREATE <object> ... CLONE。
AT | BEFORE ( TIMESTAMP => timestamp | OFFSET => time_difference | STATEMENT => id )
克隆一个数据库时,AT | BEFORE 子句指定使用 Time Travel 在过去特定时间点或之前克隆该数据库。如果指定的 Time Travel 时间等于或早于数据库创建的时间点,则克隆操作将失败并出现错误。
DATA_RETENTION_TIME_IN_DAYS = integer
指定可以对数据库执行 Time Travel 操作(CLONE 和 UNDROP)的天数,并指定在数据库中创建的所有架构的默认 Time Travel 保留时间。有关更多详细信息,请参阅 了解和使用 Time Travel。
有关此对象级参数的详细说明以及有关对象参数的详细信息,请参阅 参数。
值:
Standard Edition:
0
或1
Enterprise Edition:
对于永久数据库为
0
至90
对于临时数据库为
0
或者1
默认:
Standard Edition:
1
Enterprise Edition(或更高版本):
1
(除非在账户级别指定了不同的默认值)
备注
值为
0
时会有效禁用数据库的 Time Travel。MAX_DATA_EXTENSION_TIME_IN_DAYS = integer
对象参数,用于指定 Snowflake 可以延长数据库中表的数据保留期以防止表上的流过时的最大天数。
有关此参数的详细说明,请参阅 MAX_DATA_EXTENSION_TIME_IN_DAYS。
EXTERNAL_VOLUME = external_volume_name
对象参数,指定要用于 Iceberg 表 的默认外部卷。
有关此参数的详细信息,请参阅 EXTERNAL_VOLUME。
CATALOG = catalog_integration_name
对象参数,指定要用于 Iceberg 表 的默认目录集成。
有关此参数的详细信息,请参阅 CATALOG。
DEFAULT_DDL_COLLATION = 'collation_specification'
为添加到数据库的所有架构和表指定默认 排序规则规范。可以在架构和单个表级别上覆盖默认值。
有关该参数的更多详细信息,请参阅 DEFAULT_DDL_COLLATION。
COMMENT = 'string_literal'
指定数据库的注释。
默认:无值
访问控制要求¶
权限 |
对象 |
备注 |
---|---|---|
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 |
外部卷、目录集成 |
分别设置 |
有关创建具有指定权限集的自定义角色的说明,请参阅 创建自定义角色。
一般使用说明¶
创建数据库会自动将其设置为当前会话的活动/当前数据库(相当于使用数据库的 USE DATABASE 命令)。
如果已存在同名数据库,则返回错误并且不会创建数据库,除非命令中指定了可选的
OR REPLACE
关键字。重要
使用
OR REPLACE
相当于对现有数据库使用 DROP DATABASE,然后创建一个同名的新数据库;但是,删除的数据库 不会 从系统中永久移除。相反,它保留在 Time Travel 中。这很重要,因为 Time Travel 中删除的数据库有助于账户的数据存储。有关更多信息,请参阅 Time Travel 和故障安全的存储成本。CREATE OR REPLACE <object> 语句是原子的。也就是说,当对象被替换时,旧对象将被删除,新对象将在单个事务中创建。
创建新数据库会自动在数据库中创建两个架构:
PUBLIC:数据库的默认架构。
INFORMATION_SCHEMA:包含视图和表函数的架构,可用于查询有关数据库中的对象以及账户中的所有对象的元数据。
从共享创建的数据库与标准数据库在以下方面有所不同:
它们没有 PUBLIC 或 INFORMATION_SCHEMA 架构,除非这些架构已显式授予共享。
它们无法被克隆。
请勿应用
TRANSIENT
和DATA_RETENTION_TIME_IN_DAYS
等属性。
当数据库处于活动/当前状态时,PUBLIC 架构也默认处于活动/当前状态,除非使用不同的架构或已删除 PUBLIC 架构。
关于元数据:
注意
客户应确保在使用 Snowflake 服务时,不会将个人数据(用户对象除外)、敏感数据、出口管制数据或其他受监管数据作为元数据输入。有关更多信息,请参阅 Snowflake 中的元数据字段。
Database Replication 使用说明¶
备注
Snowflake 建议使用 账户复制功能 复制数据库。复制组和故障转移组 可启用多个数据库和其他账户对象的复制,并确保组中对象时间点的一致性。有关 功能可用性 和 受支持对象 的完整列表,请参阅 跨多个账户的复制和故障转移简介。
Database Replication 使用 Snowflake 提供的计算资源(而不是您自己的虚拟仓库)来复制对象和数据。但是,STATEMENT_TIMEOUT_IN_SECONDS 会话/对象参数仍控制语句在取消之前运行的时间。默认值为
172800
(2 天)。由于主数据库的 初始复制 可能需要 2 天以上的时间才能完成(具体取决于数据库中的元数据量以及数据库对象中的数据量),因此建议将运行复制操作的会话的 STATEMENT_TIMEOUT_IN_SECONDS 值增加到604800
(7 天,最大值)。在同一会话中执行
ALTER DATABASE secondary_db_name REFRESH
语句之前,请运行以下 ALTER SESSION 语句:ALTER SESSION SET STATEMENT_TIMEOUT_IN_SECONDS = 604800;
请注意,STATEMENT_TIMEOUT_IN_SECONDS 参数也适用于会话中的活动仓库。该参数遵循在会话或仓库级别设置的 较低 值。如果当前会话中有一个处于活动状态的仓库,也请将此仓库的 STATEMENT_TIMEOUT_IN_SECONDS 设置为
604800
(使用 ALTER WAREHOUSE)。例如:
-- determine the active warehouse in the current session (if any) SELECT CURRENT_WAREHOUSE(); +---------------------+ | CURRENT_WAREHOUSE() | |---------------------| | MY_WH | +---------------------+ -- change the STATEMENT_TIMEOUT_IN_SECONDS value for the active warehouse ALTER WAREHOUSE my_wh SET STATEMENT_TIMEOUT_IN_SECONDS = 604800;
复制操作完成后,您可以将参数值重置为默认值:
ALTER WAREHOUSE my_wh UNSET STATEMENT_TIMEOUT_IN_SECONDS;
识别存储主数据库的账户的首选方法是使用组织名称和账户名称作为账户标识符。如果您决定改用旧版账户定位器,则可能需要包含额分段以唯一标识账户。请参阅下表:
账户标识符
远程账户的位置
organization_name.account_name
可以使用的首选账户标识符(无论存储主数据库的账户属于哪个区域或区域组)。
account_locator
与存储主数据库的账户所在区域相同,但账户不同。
snowflake_region.account_locator
与存储主数据库的账户所在区域组相同,但所在区域不同。
region_group.snowflake_region.account_locator
与存储主数据库的账户所在 区域组 不同。
CREATE DATABASE ...AS REPLICA 命令不支持 WITH TAG 子句。
此子句不受支持,因为辅助数据库是只读的。如果主数据库指定 WITH TAG 子句,请删除该子句以创建辅助数据库。要验证您的数据库是否存在 WITH TAG 子句,请调用 Snowflake 账户中的 GET_DDL 函数并在函数实参中指定主数据库。如果在数据库上设置了标签,则函数输出将包括 ALTER DATABASE ...SET TAG 语句。
有关更多详细信息,请参阅 复制和标签。
示例¶
创建两个永久数据库,其中一个数据保留期为 10 天:
CREATE DATABASE mytestdb;
CREATE DATABASE mytestdb2 DATA_RETENTION_TIME_IN_DAYS = 10;
SHOW DATABASES LIKE 'my%';
+---------------------------------+------------+------------+------------+--------+----------+---------+---------+----------------+
| created_on | name | is_default | is_current | origin | owner | comment | options | retention_time |
|---------------------------------+------------+------------+------------+--------+----------+---------+---------+----------------|
| Tue, 17 Mar 2016 16:57:04 -0700 | MYTESTDB | N | N | | PUBLIC | | | 1 |
| Tue, 17 Mar 2016 17:06:32 -0700 | MYTESTDB2 | N | N | | PUBLIC | | | 10 |
+---------------------------------+------------+------------+------------+--------+----------+---------+---------+----------------+
创建瞬态数据库:
CREATE TRANSIENT DATABASE mytransientdb;
SHOW DATABASES LIKE 'my%';
+---------------------------------+---------------+------------+------------+--------+----------+---------+-----------+----------------+
| created_on | name | is_default | is_current | origin | owner | comment | options | retention_time |
|---------------------------------+---------------+------------+------------+--------+----------+---------+-----------+----------------|
| Tue, 17 Mar 2016 16:57:04 -0700 | MYTESTDB | N | N | | PUBLIC | | | 1 |
| Tue, 17 Mar 2016 17:06:32 -0700 | MYTESTDB2 | N | N | | PUBLIC | | | 10 |
| Tue, 17 Mar 2015 17:07:51 -0700 | MYTRANSIENTDB | N | N | | PUBLIC | | TRANSIENT | 1 |
+---------------------------------+---------------+------------+------------+--------+----------+---------+-----------+----------------+
使用账户 ab67890
提供的共享创建数据库:
CREATE DATABASE snow_sales FROM SHARE ab67890.sales_s;
有关使用共享创建数据库的更多详细示例,请参阅 使用共享数据。
Database Replication 示例¶
以下示例在 myorg
组织的 account1
账户中创建 myorg.account1.mydb1
主数据库的副本,并启用副本中物化视图的自动刷新。SQL 语句在同一个 AWS 区域组 (public
) 执行,但与存储主数据库的账户区域不同:
CREATE DATABASE mydb1
AS REPLICA OF myorg.account1.mydb1
DATA_RETENTION_TIME_IN_DAYS = 10;