使用 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;
}
}
当我的脚本有 "CREATE TABLE XXX AS SELECT..." 语句时,我遇到了同样的错误。
我通过将它分成两个单独的语句来修复它:
CREATE TABLE XXX (columns def...);
INSERT INTO TABLE XXX (columns...)
SELECT...;
我尝试在迁移前和迁移后添加脚本作为 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;
}
}
当我的脚本有 "CREATE TABLE XXX AS SELECT..." 语句时,我遇到了同样的错误。
我通过将它分成两个单独的语句来修复它:
CREATE TABLE XXX (columns def...);
INSERT INTO TABLE XXX (columns...)
SELECT...;