【问题标题】:How to handle DCL in Flyway migration scripts?如何在 Flyway 迁移脚本中处理 DCL?
【发布时间】:2017-05-21 10:53:46
【问题描述】:

我有一个已定义用户和角色的 postgres 数据库。该数据库中有多个模式,它们都通过不同的项目/flyway 脚本进行控制。我正在努力将 Flyway 集成添加到一个新项目中,我们将在其中使用嵌入式 Postgres 实例进行测试。

由于此实例上不存在这些用户/角色,因此需要在迁移脚本中创建它们。但是,由于这些用户/角色已经存在于我的操作数据库中,因此当他们尝试创建角色时迁移将失败。

我已经考虑为此编写一个函数,但是该函数必须包含在任何使用嵌入式 Postgres 的项目中,并且必须跨多个代码库进行维护。这似乎很草率。谁能为我推荐一种使用 Flyway 处理这些 DCL 操作的方法,该方法可以与嵌入式方法以及我的操作数据库一起使用?

【问题讨论】:

  • Flyway 不像 Liquibase 那样提供一些先决条件吗? (只有在前提条件为真时才会执行迁移)或者如果行已经存在,您可以使用 Postgres 的 insert ... on conflict do nothing 语法使语句不会失败
  • 我没有从粗略的谷歌搜索中看到任何内容,或者在 Flyway 的文档中没有看到任何明显的内容。这似乎是一个非常重要的功能。

标签: java postgresql flyway embedded-database


【解决方案1】:

在之前的项目中,我们为此方法使用了一组额外的 Flyway 迁移脚本。我们将这些脚本添加到测试环境的类路径中。 在添加回调和可重复迁移功能之前,我们将其用于 Flyway 版本。

为您的测试环境添加回调配置,并在迁移之前或之后添加您的用户和角色。

第三种解决方案为您的用户和角色设置使用可重复的迁移脚本,请参阅https://flywaydb.org/documentation/migration/repeatable。在生产和测试中使用此脚本。但在这种情况下,您的 sql 必须正确且可重复,否则您将破坏生产环境。

【讨论】:

  • 似乎选项 2 是最简单的方法。由于这将在回调中完成,如果角色已经存在,它会失败吗?如何仅为测试环境进行回调?我是否必须让它使用单独的迁移脚本路径?
  • 我想到了 Java 回调,因为 nwith SQL 回调它类似于解决方案一。 1. 实现您的回调 2. 在测试环境中,您配置 Flyway 配置以使用您的回调实现。配置取决于您的迁移在测试阶段的工作方式。命令行示例见flywaydb.org/documentation/commandline/migrateflyway -callback=your.Callback migrate
  • 哇,我明白了。过去我对这部分有点混淆,因为我们使用的是 Spring Boot 集成,所以不必对迁移脚本做任何花哨的事情。
猜你喜欢
  • 2018-02-28
  • 2017-03-16
  • 2013-06-02
  • 2011-11-05
  • 2020-11-13
  • 2020-08-17
  • 2014-05-12
  • 2012-08-06
  • 2016-03-12
相关资源
最近更新 更多