使用 Oracle 编译的 Flyway 回调

Flyway callbacks with Oracle compile

我尝试在迁移前和迁移后添加脚本作为 flyway 的回调,用于编译我的视图、过程、函数等。 是否有可能在迁移过程之前停止它,或者在脚本失败之前或之后回滚(或者更确切地说 return 警告)?

因为我现在唯一看到的就是收到这样的警告

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

它继续,没有停止。 我考虑了 FlywayCallback 接口及其实现,但我不完全确定应该如何通过编译来完成它。

我正在使用 Spring Boot 1.2.5 和最新的 Flyway。

我也有同样的错误。 SQL State: 99999 - Error Code: 17110。我找到了这个解决方案。 检查此警告下的哪个版本和 sql 脚本检查下的那个版本有触发器或任何未正确关闭的程序。

如果 oracle DB / 触发器结束,则关闭触发器或任何过程。

例如:

CREATE OR REPLACE TRIGGER Print_salary_changes
  BEFORE DELETE OR INSERT OR UPDATE ON Emp_tab
  FOR EACH ROW
WHEN (new.Empno > 0)
DECLARE
    sal_diff number;
BEGIN
    sal_diff  := :new.sal  - :old.sal;
    dbms_output.put('Old salary: ' || :old.sal);
    dbms_output.put('  New salary: ' || :new.sal);
    dbms_output.put_line('  Difference ' || sal_diff);
END;
/

Flyway 5.0 现在带有一个称为错误处理程序的功能,可以让您做到这一点。您现在可以创建一个错误处理程序,将警告转化为错误,就像

import org.flywaydb.core.api.FlywayException;
import org.flywaydb.core.api.errorhandler.Context;
import org.flywaydb.core.api.errorhandler.ErrorHandler;
import org.flywaydb.core.api.errorhandler.Warning;

public class OracleProcedureFailFastErrorHandler implements ErrorHandler {
    @Override
    public boolean handle(Context context) {
        for (Warning warning : context.getWarnings()) {
            if ("99999".equals(warning.getState()) && warning.getCode() == 17110) {
                throw new FlywayException("Compilation failed");
            }
        }
        return false;
    }
}

文档中的更多信息:https://flywaydb.org/documentation/errorhandlers

当我的脚本有 "CREATE TABLE XXX AS SELECT..." 语句时,我遇到了同样的错误。

我通过将它分成两个单独的语句来修复它:

CREATE TABLE XXX (columns def...);

INSERT INTO TABLE XXX (columns...)
SELECT...;