当前位置: 首页 > 知识库问答 >
问题:

即使SQL语句失败,也强制迁移

裘丰
2023-03-14

我已经为工作中的应用程序创建了一个flyway项目。事实证明,在我准备好flyway设置进行测试之前,其中一个开发人员已经在测试中执行了一些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实例上,我想通过迁移而不是手动进行。

显然,如果不先在测试中进行测试,我不会在PROD上运行迁移(有比这三个查询多得多的东西)。

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

有没有办法强行通过?我知道那个专栏已经被删除了。我可以再次创建它,然后让迁移删除它。但是我可能有其他可能失败的查询(创建可能已经存在的种子数据,等等)。我不希望这阻止我们的部署。

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

共有3个答案

商业
2023-03-14

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

WHENEVER SQLERROR CONTINUE
穆子琪
2023-03-14

听起来,重新创建专栏确实听起来是最好的解决方案。

这是非常简单的,如果唯一的目的是让列立即再次下降,绝对无害。

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

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

燕成双
2023-03-14

您可以将任何要忽略错误的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中的执行立即语句中完成。

有点痛,但应该有效。

 类似资料:
  • 问题内容: 我不确定为什么它不显示sql语句。我之前使用过它(在较早的春天,这次我使用3) 在ApplicationContext中,我有: 在log4j中: 其他一切似乎都很好,但是它并没有显示sql。 我有想念吗? (或者是否可以从org.hibernate.cfg.Environment.getProperties()的SessionFactory打印?它没有显示show_sql,可能甚至没

  • 我是mySQL的新手,在学习连接的同时,我尝试使用左连接、右连接和完全外部连接来创建一个完全连接。然后我意识到我的一个原始表(表t2)有一个空行。 当尝试删除它时,我得到错误:错误代码:1175。您正在使用安全更新模式,并且试图更新一个没有使用键列禁用安全模式的WHERE的表,请在Preferences->SQL Editor中切换该选项并重新连接。 更新:当我使用MySQL命令行时,我没有看到空

  • 我有Inno安装程序的应用程序。应用程序在后台运行。这意味着,当我升级应用程序(在旧版本上安装新版本)时,我需要安装程序来关闭此应用程序,以便可以正常替换所有文件。 但似乎,有时它由于某种未知原因无法关闭应用程序。为了获得理由,我想记录它。问题是,由于安装程序无法替换文件,用户会收到错误消息,这会阻止安装程序完成。Inno 安装程序仅在成功完成安装后写入日志。 实际问题是,最后一条语句是否正确,或

  • 问题内容: 我有一个映射到国家/地区实体的userAccount实体。UserAccount类中的国家/地区映射是这样的 即使将fetchmode定义为Join,hibernate也会触发单独的SQL Select来提取国家/地区。 问题答案: 删除。渴望获取将触发级联选择语句。

  • 我在Amazon RDS上的mysql DB8.0.20版本中有两个表,它们之间有一个外键。 当我尝试插入第二个表时,我得到一个外键错误,但我确定第一个表中存在该键。 然后我跑: 那么,如果ID存在于表1中,为什么表2不能在外键列中使用它呢?我错过了什么?

  • 我使用CORS请求将数据发布到不同域上的php脚本。我收到错误: 跨域请求被阻止:同源策略不允许读取“mydomain”处的远程资源(原因:缺少CORS标头“Access-Control-Allow-Origin”)。 我已经使用以下代码在php中设置了标题。 我也在这篇文章中尝试了这个代码 这是供参考的javascript代码 响应标题 请求标头 但我运气不好任何帮助我都很感激