【问题标题】:How to rollback a drop column in Liquibase如何在 Liquibase 中回滚放置列
【发布时间】:2021-07-05 02:45:48
【问题描述】:

回滚这个 liquibase 脚本的最佳方法是什么?

<changeSet  author="me"  id="drop_column_example">
  <dropColumn  tableName="BLABLA">
    <column  name="example"/>
  </dropColumn>
</changeSet>

通常当我删除一个表时,我会从删除之前创建的重复临时表中恢复所有数据,但是我该如何管理呢?

PS:我需要恢复该列中的所有旧数据。

【问题讨论】:

    标签: liquibase rollback


    【解决方案1】:

    Liquibase 提供了撤消对数据库所做更改的命令。回滚脚本的目的是将数据库返回到之前指定的时间点。

    Liquibase 操作分为两类,导致产生不同的回滚语句:

    1.自动 - 迁移可以确定性地生成回滚所需的步骤

    2。手动 - 我们需要发出回滚命令,因为迁移指令不能用于确定性地识别语句

    例如,“create table” 语句的回滚将是 “drop” 创建的表。这可以毫无疑问地确定,因此可以自动生成回滚语句。

    另一方面,“drop table” 命令的回滚语句无法确定。无法确定表的最后状态,因此无法自动生成 回滚语句。这些类型的迁移语句需要手动回滚说明。

    阅读更多关于它的信息herehere

    在您的情况下,无法确定 “drop column” 命令的回滚语句。您必须手动为您的表编写一个“alter table ADD column” 语句。 对于您的示例,查询将是:

    ALTER TABLE BLABLA ADD COLUMN example DATATYPE;
    

    所以完整的变更集看起来像这样:

    <changeSet  author="me"  id="drop_column_example">
      <dropColumn  tableName="BLABLA">
        <column  name="example"/>
      </dropColumn>
      <rollback>
        ALTER TABLE BLABLA ADD COLUMN example COLUMN_DATATYPE;
      </rollback>
    </changeSet>
    

    要恢复列中的数据,您必须创建一个变更集以将数据从重复的临时表(类似于您在 “drop table” 中提到的方式)复制并插入到此创建的列。确保在“drop column”的回滚查询成功执行后执行列中的数据插入。

    您可以创建一个单独的变更集,也可以包含复制和插入旧数据以恢复到上述变更集中的新列的逻辑,如下所示:

    <changeSet  author="me"  id="drop_column_example">
      <dropColumn  tableName="BLABLA">
        <column  name="example"/>
      </dropColumn>
      <rollback>
        ALTER TABLE BLABLA ADD COLUMN example COLUMN_DATATYPE;
        <!-- Logic to restore old data goes here OR include the changeset created separately for data restoration here (After creating the dropped column)  -->
      </rollback>
    </changeSet>
    

    添加了将旧数据从临时表复制到新创建的表的逻辑 -

    INSERT INTO `New_Table` (`example`) VALUES
         (SELECT `example` FROM `Temporary_Table` WHERE 
         `New_Table`.`Some_Common_Column` = `Temporary_Table`.`Some_Common_Column`);
    

    您需要将旧数据维护到表中,以便在恢复时将其插入到主键列或新创建的表和备份表之间共有的某些列。如果没有这样的结构,您将无法在新表列中映射所需的列数据以进行数据恢复。

    【讨论】:

    • 假设有一个表的副本可用于恢复数据。真正的问题是编写恢复旧数据的逻辑,我怎么知道记录值从旧表插入到最新表中?
    • 使用代码编辑响应以将数据从表的一列复制到另一列。这里的限制是表的结构。表之间需要有一些公共列,以方便插入数据,否则您将无法知道哪个值属于表的哪个记录。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-19
    • 2018-09-13
    相关资源
    最近更新 更多