我们在Oracle上使用Flyway 4(很棒的工具!)。
当提交无效的DDL时,连续数据库构建会中断...并且所有团队都会收到一封电子邮件..到目前为止一切都很好。
但是,当我们提交破坏我们的一个存储过程的代码时...即创建了过程,但它无法编译..我们仍然从Flyway报告了成功的迁移。
在迁移过程中,我们会看到类似的内容:
DB: Warning: execution completed with warning (SQL State: 99999 - Error Code: 17110)
..但仍然是Flyway蚂蚁任务报告成功。
由于我们有很多存储过程,因此这些被开发人员破坏了9次,而不是DDL。我们真的希望Flyway在警告时失败。任何人都可以建议如何最好地接近这个?
答案 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");
}
}
}