如何回滚 Liquibase 中的下拉列
How to rollback a drop column in Liquibase
回滚此 liquibase 脚本的最佳方法是什么?
<changeSet author="me" id="drop_column_example">
<dropColumn tableName="BLABLA">
<column name="example"/>
</dropColumn>
</changeSet>
通常当我删除 table 时,我会从删除之前创建的重复临时 table 恢复所有数据,但我该如何管理它?
PS: 我需要恢复该列中的所有旧数据。
Liquibase 提供撤消对数据库所做更改的命令。回滚脚本的目的是 return 数据库到以前指定的时间点。
有两类 Liquibase 操作,导致生成不同的回滚语句:
1.自动 - 迁移可以确定性地生成回滚所需的步骤
2。手动 - 我们需要发出回滚命令,因为迁移指令不能用于确定性地识别语句
例如, “创建 table” 语句的回滚将是 “ drop” 创建的 table。这一点可以确定无疑,因此可以自动生成回滚语句。
另一方面,无法确定“drop table”命令的回滚语句。无法确定 table 的最后状态,因此无法自动生成 回滚语句 。这些类型的迁移语句需要手动回滚 说明。
在您的情况下,无法确定 “删除列” 命令的回滚语句。您必须手动为您的 table 编写一个 “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>
要恢复列中的数据,您必须创建一个变更集来复制和插入来自重复临时数据的数据 table(类似于您提到的 “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>
添加了将旧数据从临时 table 复制到新创建的 table -
的逻辑
INSERT INTO `New_Table` (`example`) VALUES
(SELECT `example` FROM `Temporary_Table` WHERE
`New_Table`.`Some_Common_Column` = `Temporary_Table`.`Some_Common_Column`);
您需要将旧数据维护到 table 中,以便您可以在恢复时插入它,并适当映射到主键列或新数据之间共有的某些列创建 table 和备份 table。如果没有这样的结构,您将无法映射所需的列数据以在新的 table 列中进行数据恢复。
回滚此 liquibase 脚本的最佳方法是什么?
<changeSet author="me" id="drop_column_example">
<dropColumn tableName="BLABLA">
<column name="example"/>
</dropColumn>
</changeSet>
通常当我删除 table 时,我会从删除之前创建的重复临时 table 恢复所有数据,但我该如何管理它?
PS: 我需要恢复该列中的所有旧数据。
Liquibase 提供撤消对数据库所做更改的命令。回滚脚本的目的是 return 数据库到以前指定的时间点。
有两类 Liquibase 操作,导致生成不同的回滚语句:
1.自动 - 迁移可以确定性地生成回滚所需的步骤
2。手动 - 我们需要发出回滚命令,因为迁移指令不能用于确定性地识别语句
例如, “创建 table” 语句的回滚将是 “ drop” 创建的 table。这一点可以确定无疑,因此可以自动生成回滚语句。
另一方面,无法确定“drop table”命令的回滚语句。无法确定 table 的最后状态,因此无法自动生成 回滚语句 。这些类型的迁移语句需要手动回滚 说明。
在您的情况下,无法确定 “删除列” 命令的回滚语句。您必须手动为您的 table 编写一个 “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>
要恢复列中的数据,您必须创建一个变更集来复制和插入来自重复临时数据的数据 table(类似于您提到的 “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>
添加了将旧数据从临时 table 复制到新创建的 table -
的逻辑INSERT INTO `New_Table` (`example`) VALUES
(SELECT `example` FROM `Temporary_Table` WHERE
`New_Table`.`Some_Common_Column` = `Temporary_Table`.`Some_Common_Column`);
您需要将旧数据维护到 table 中,以便您可以在恢复时插入它,并适当映射到主键列或新数据之间共有的某些列创建 table 和备份 table。如果没有这样的结构,您将无法映射所需的列数据以在新的 table 列中进行数据恢复。