CREATE OR ALTER <对象>¶
CREATE OR ALTER 命令是 DDL 命令,结合了 CREATE 命令和 ALTER 命令的功能,允许您使用 CREATE <object> 支持的语法定义对象,同时受到 ALTER <object> 命令的限制。
这些命令维护数据和关联,这表示数据和其他状态、标签关联和附加策略以及对于对象的权限授予都将得到保留。但某些对象转换可能导致数据删除。例如,如果一条 CREATE OR ALTER TABLE 语句导致一列被删除,该列中包含的所有数据都会被删除。
通过 CREATE OR ALTER 命令,您可以使用声明性、幂等方法向对象应用增量更新。执行时,CREATE OR ALTER 语句会产生以下结果之一:
如果该对象不存在,根据定义创建该对象。
如果该对象存在,将其更改为语句中定义的对象。
如果该对象已经与定义相匹配,则保持不变。
该命令会保留对象的数据、状态、标签关联、附加策略和权限授予。但某些转换可能会导致数据删除。例如,如果 CREATE OR ALTER TABLE 语句删除一列,该列中的数据将会丢失,但仍可以使用 Time Travel 恢复。
语法¶
CREATE OR ALTER <object_type> <object_name>
[ <object_type_properties> ]
[ <object_type_params> ]
[ COMMENT = '<string_literal>' ]
其中 object_type_properties
和 object_type_params
特定于对象类型。
有关具体语法、使用说明和示例,请参阅:
账户对象:
数据库对象:
一般使用说明¶
数据治理:CREATE OR ALTER 命令不支持数据治理变更。现有标签或策略不受 CREATE OR ALTER 语句影响且保持不变。
取消设置对象属性和参数:如果修改后的对象定义中不存在先前已设置的属性或参数,则会取消设置此属性或参数。
如果您取消设置显式 参数 值,该参数将重置为默认值。如果在包含目标对象的对象上设置该参数,目标对象会继承在包含该目标对象的对象上设置的值。否则,该对象的参数值将会重置为默认值。
原子性:CREATE OR ALTER TABLE 命令目前不能保证原子性。这意味着,如果 CREATE OR ALTER TABLE 语句在执行期间失败,则可能对该表应用了部分变更。如果有应用部分更改的可能性,在大多数情况下,错误消息包括以下文本:
CREATE OR ALTER execution failed. Partial updates may have been applied.
例如,如果该语句尝试删除
A
列,并将新的B
列添加到表中,但该语句中止,则A
列可能已删除但B
列未添加。备注
如果应用了部分更改,所生成的表仍处于有效状态,您可以使用额外的 ALTER TABLE 语句来完成最初的更改集。
要从部分更新中恢复,Snowflake 推荐使用以下恢复机制:
向前修复
再次执行 CREATE OR ALTER TABLE 语句。如果在第二次尝试时,该语句成功,则达到目标状态。
研究错误消息。如有可能,修复错误并再次执行 CREATE OR ALTER TABLE 语句。
回滚
如果无法向前修复,Snowflake 推荐手动回滚部分更改:
使用 DESCRIBE TABLE 和 SHOW TABLES 命令研究表的状态。确定应用了哪些部分更改(如有)。
如果应用了任何部分更改,请执行适当的 ALTER TABLE 语句,将表转换回其原始状态。
备注
在某些情况下可能无法撤消部分更改。有关更多信息,请参阅 ALTER TABLE ...ALTER COLUMN 主题中受支持和不受支持的列属性修改操作。
如果您需要帮助从部分更新中恢复,请联系 Snowflake 支持部门。
限制¶
CREATE OR ALTER <object> 命令的具体限制取决于对象。部分限制示例如下:
CREATE OR ALTER TABLE 命令不支持搜索优化,因为搜索优化不是 CREATE TABLE 语法的一部分。
您不能将表中某列的数据类型更改为不兼容的数据类型。
您不能更改现有视图的定义。
您必须先暂停任务,然后才能对其进行更改。
目前不支持用于创建对象的变体语法(例如,CREATE OR ALTER TABLE ...AS SELECT)。
有关特定对象的限制,请参阅 相应对象的参考主题。
用例示例¶
如果您有为应用程序设置 Snowflake 对象的 SQL 脚本,则可以在脚本中使用 CREATE OR ALTER <object> 语句,以便更轻松地在开发、测试和生产环境中部署更改。随着应用程序的发展变化,您可以对脚本进行修改。
通过使用 CREATE OR ALTER <object> 语句,可以在新环境中运行脚本,也可以在现有环境中重新运行脚本,这样您只需编写一次所需的对象定义,即可将其应用到各个环境中。