Liquibase 脚本不保存数据

Posted

技术标签:

【中文标题】Liquibase 脚本不保存数据【英文标题】:Liquibase script doesn't persist data 【发布时间】:2017-02-07 08:36:14 【问题描述】:

我正在进行数据库迁移,我们将数据从 1 个表迁移到 2 个其他表。为此,我使用 PL/SQL 脚本。一个非常简化的脚本版本如下所示:

BEGIN
  FOR foo IN (SELECT * FROM FOO) LOOP
    INSERT INTO BAR (ID, STATUS)
    VALUES (foo.ID, foo.STATUS);

    FOR foolog IN (SELECT * FROM FOO_LOG where ID = foo.ID) LOOP
      INSERT INTO BAR_LOG (ID, REV);
      VALUES (FOO_SEQ.CURRVAL, foolog.REV);
    END LOOP;
  END LOOP;
END;

问题是:liquibase 运行脚本,但没有数据保存到数据库,看起来好像脚本没有运行。如果我故意引入错字(例如更改表名),脚本将无法运行,因此它确实执行了脚本。此外,当我手动运行 SQL 时,它按预期工作,因此问题似乎与 liquibase 有关。

关于为什么会发生这种情况/如何解决这个问题的任何线索?

编辑:

使用的变更集:

<changeSet id="2.4.0-03" author="bvandenberge">
    <sqlFile path="03-pie-conversion.sql"
             relativeToChangelogFile="true"
             plitStatements="false" />
    <rollback />
</changeSet>

【问题讨论】:

你在某个时候做过commit;吗?这对于基于事务的数据库是必需的。 @J.Chomel 我尝试添加一个 COMMIT;就在END之前;但这并没有改变行为。接下来,在 liquibase 中,所有变更集都在事务中运行,因此在这种情况下应处理提交。 这个&lt;rollback /&gt;是干什么用的? 这表明在回滚的情况下,不必发生任何事情来恢复此 changeSet 所做的更改 如果你删除它呢? (对不起,我不知道这项技术)。 【参考方案1】:

我发现它为什么不起作用,这是我自己的一个非常愚蠢的错误。与 liquibase 无关。

我通过 Intellij Oracle 控制台插入测试数据。显然,此控制台默认运行事务中的所有内容,但不会自动提交。所以发生的事情是我通过 Intellij 插入了测试数据,然后在 liquibase 中运行脚本(由于 Intellij 中的事务未提交,因此没有找到任何数据),然后尝试在 Intellij 中查看结果。在 Intellij 中手动提交测试数据事务后一切正常。

【讨论】:

以上是关于Liquibase 脚本不保存数据的主要内容,如果未能解决你的问题,请参考以下文章

Liquibase 了解

Liquibase 与数据库交互

Liquibase使用小结

Flyway 或 Liquibase 可以生成更新脚本而不是直接更新数据库吗?

Liquibase 脚本失败

Liquibase - 执行前测试变更集