即使数据库发出警告,Flyway也会报告成功

时间:2016-05-27 13:29:47

标签: flyway

我们在Oracle上使用Flyway 4(很棒的工具!)。

当提交无效的DDL时,连续数据库构建会中断...并且所有团队都会收到一封电子邮件..到目前为止一切都很好。

但是,当我们提交破坏我们的一个存储过程的代码时...即创建了过程,但它无法编译..我们仍然从Flyway报告了成功的迁移。

在迁移过程中,我们会看到类似的内容:

DB: Warning: execution completed with warning (SQL State: 99999 - Error Code: 17110)

..但仍然是Flyway蚂蚁任务报告成功。

由于我们有很多存储过程,因此这些被开发人员破坏了9次,而不是DDL。我们真的希望Flyway在警告时失败。任何人都可以建议如何最好地接近这个?

1 个答案:

答案 0 :(得分:0)

解决!为我们找到了一个可接受的解决方案,并使用Flyway网站上记录的Flyways回调机制实现如下。

有许多可用的回调可以在不同的点上调用,但看起来符合我们需求的是afterMigrate。在回调中,我们可以执行sql(在Oracle上),它计算手头用户模式中无效对象的数量

因此,实现了一个java afterMigrate回调,如下所示:

    public void afterMigrate(Connection connection) {
    String countInvalidObjs = "select count(*) " +
                              "from user_objects " +
                              "where object_type in ('FUNCTION','PROCEDURE','PACKAGE','PACKAGE BODY','TRIGGER') " + 
                              "and status = 'INVALID' ";
    int invalidObjCount = -1;
    Statement statement;
    try {
        statement = connection.createStatement();
        ResultSet rs = statement.executeQuery(countInvalidObjs);
        while (rs.next()) {
            invalidObjCount = rs.getInt(1);
        }
    } catch(Throwable t) {
        System.out.println("*error* " + t.getMessage());
    } finally {
        if(invalidObjCount!=0) {
            throw new IllegalArgumentException("fail to complete migration, build finished with databse warnings");
        }
    }
}