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 <object>ALTER * <object>*

语法

CREATE OR ALTER <object_type> <object_name>
  [ <object_type_properties> ]
  [ <object_type_params> ]
  [ COMMENT = '<string_literal>' ]
Copy

其中 object_type_propertiesobject_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 TABLESHOW 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> 语句,可以在新环境中运行脚本,也可以在现有环境中重新运行脚本,这样您只需编写一次所需的对象定义,即可将其应用到各个环境中。

语言: 中文