1

我为工作中的应用程序创建了一个 flyway 项目。事实证明,在我准备好 flyway 设置以进行测试之前,其中一位开发人员已经在 TEST 上执行了一些 SQL 语句。

我的 sql 脚本有一些语句:

ALTER TABLE "TABLE1" MODIFY ("NAME" VARCHAR2(75 CHAR));
ALTER TABLE "TABLE2" DROP ("BOARD_ID");
ALTER TABLE "TABLE3" ADD CONSTRAINT "SYS_C0022270" CHECK ("ID" IS NOT NULL) ENABLE;

应该在语句 #2 中删除的列已经在我们的 TEST 实例上手动删除。它还没有被我们的 PROD 实例删除,我想通过迁移而不是手动来完成。

显然,如果不先在 TEST 上进行尝试,我就不会在 PROD 上运行迁移(比这三个查询要多得多)。

但是由于我遇到问题的迁移是第一个,因此无法继续。

有什么办法可以强制通过吗?我知道该列已被删除。我可以再次创建它,然后让迁移将其删除。但是我可能还有其他可能失败的查询(创建可能已经存在的种子数据等)。我不希望这会阻止我们的部署。

除了再次从 PROD 克隆我们的数据库并让开发团队在我准备一组新的迁移时停止他们的开发之外,还有什么想法吗?

4

4 回答 4

5

您可以将任何您想要忽略错误的 SQL 语句放在带有异常处理程序的 PL/SQL 块中:

BEGIN 
  EXECUTE IMMEDIATE 'ALTER TABLE "TABLE1" MODIFY ("NAME" VARCHAR2(75 CHAR))';
EXCEPTION
  WHEN OTHERS THEN
    -- perhaps print a message about the command failure here
END;
/

DDL 必须在 PL/SQL 中的立即执行语句内完成。

有点痛苦,但它应该工作。

于 2012-05-08T17:21:44.470 回答
1

从它的声音来看,重新创建列确实听起来是最好的解决方案。

它超级简单,如果唯一的目的是让柱子在之后立即再次被丢弃,绝对无害。

除非我错过了故事的一部分,否则我无法理解种子数据的未来创建如何与此冲突。

长期的解决方案当然是改变开发文化并完全禁止手动更改数据库。

于 2012-05-08T18:26:15.377 回答
0

如果您使用 sqlplus 运行脚本,则可以在开头添加以下语句:

WHENEVER SQLERROR CONTINUE
于 2012-05-08T16:53:04.887 回答
0

当 SQLERROR CONTINUE 和 DBMS_OUTPUT.PUT_LINE() 不适用于 flyway 它是 SQLPLUS 客户端特定的,你可以使用 RAISE

EXCEPTION

WHEN OTHERS THEN

DBMS_OUTPUT.PUT_LINE(SQLERRM || CHR(10) ||DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);

ROLLBACK;

Raise_Application_Error (-20000, SQLERRM || ' : ' ||DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);

END;

Flyway 将停止迁移过程并在日志中打印问题。

如果您想继续迁移,请不要用户提出而是另一种打印解决方案。用flyway 4.0.3测试

于 2017-01-05T10:29:39.383 回答