如何解决如何在 Liquibase 中回滚删除列
回滚这个 liquibase 脚本的最佳方法是什么?
<changeSet author="me" id="drop_column_example">
<dropColumn tableName="BLABLA">
<column name="example"/>
</dropColumn>
</changeSet>
通常,当我删除一个表时,我会从删除前创建的重复临时表中恢复所有数据,但我该如何管理?
PS:我需要恢复该列中的所有旧数据。
解决方法
Liquibase 提供了撤销对数据库所做更改的命令。回滚脚本的目的是将数据库返回到先前指定的时间点。
Liquibase 操作有两类,导致回滚语句的生成不同:
1.自动 - 迁移可以确定性地生成回滚所需的步骤
2.手动 - 我们需要发出回滚命令,因为无法使用迁移指令来确定性地识别语句
例如,“create table” 语句的回滚将是 “drop” 创建的表。这可以毫无疑问地确定,因此可以自动生成回滚语句。
另一方面,无法确定 “drop table” 命令的回滚语句。无法确定表的最后状态,因此无法自动生成回滚语句。这些类型的迁移语句需要手动回滚说明。
在您的情况下,无法确定 “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>
要恢复列中的数据,您必须创建一个变更集以将数据从重复的临时表(类似于您提到的“删除表”)复制并插入到此创建的列。确保在“删除列”的回滚查询执行成功后执行列中的数据插入。
您可以创建一个单独的变更集,也可以包含复制和插入旧数据以恢复到上述变更集中的新列的逻辑,如下所示:
<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`);
您需要将旧数据维护到表中,以便您可以在恢复时插入它,并正确映射到主键列或新创建的表和备份表之间常见的某些列。如果没有这样的结构,您将无法在新的表列中映射数据恢复所需的列数据。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。