7

我以前从未使用过 Liquibase,只是不知道如何解决这个问题。我最近加入的项目是对旧项目的翻版,所以我们必须坚持使用旧数据库,它的架构设计得很糟糕。数据库不使用外键约束,因此仍有条目指向不再存在的条目。就我而言,是一位医生在数据库中不存在的银行拥有银行账户。到目前为止,我的团队处理这些问题的方式是用 NULL 覆盖 ID。所以基本上我要做的是将所有银行账户 ID 设置为 NULL,当银行不存在时。我为完成此任务而编写的 SQL 代码如下:

UPDATE DOCTOR SET FK_BANKID = NULL WHERE FK_BANKID NOT IN (SELECT ID FROM BANK);

有人告诉我将该修复程序集成到我们的 Liquibase 变更集中,但我就是不知道该怎么做。这是我到目前为止所做的:

<?xml version="1.0" encoding="UTF-8"?>

<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog 
                                       http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-2.0.xsd">
    <changeSet id="remove_fk_bankid" author="v7">
        <update tableName="DOCTOR">
            <column name="FK_BANKID" value="NULL" />
            <where>FK_BANKID NOT IN (SELECT ID FROM BANK)</where>
        </update>
    </changeSet>
</databaseChangeLog>

Liquibase 更新运行没有错误,但是当我之后查看数据库时,什么都没有改变。有人对我如何解决这个问题有任何指示吗?

4

1 回答 1

9

我终于弄清楚了问题所在。变更集本身实际上没有问题。当 Liquibase 更新数据库时,它会记录数据库中的所有变更集,以便已经执行的变更集不会再次执行。Liquibase 保存变更集内容的哈希,以便再次执行已更改的变更集。实际问题是当我第一次执行变更集时数据库是干净的,因为我使用以下 SQL 命令手动完成了它:UPDATE DOCTOR SET FK_BANKID = NULL WHERE FK_BANKID NOT IN (SELECT ID FROM BANK);. 之后我更改了一个医生行并将银行 ID 设置为不存在的银行并再次执行变更集,只是为了测试变更集是否真的有效。由于 Liquibase 在它的日志中有我的变更集,所以它没有再次执行。因此我看不到数据库的变化。我注意到当我回滚所有更改并再次更新数据库时。

为了完成变更集,我还必须定义回滚,因为 Liquibase 无法自动回滚行更新。由于银行账户的 ID 永远丢失了,我只是添加了一个空的回滚命令:

<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog 
                                       http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-2.0.xsd">
    <changeSet id="remove_fk_bankid" author="v7">
        <update tableName="DOCTOR">
            <column name="FK_BANKID" value="NULL" />
            <where>FK_BANKID NOT IN (SELECT ID FROM BANK)</where>
        </update>
        <rollback>
        </rollback>
    </changeSet>
</databaseChangeLog>
于 2013-03-14T16:18:37.513 回答