Java 如何在Flyway迁移脚本中处理DCL?

Java 如何在Flyway迁移脚本中处理DCL?,java,postgresql,flyway,embedded-database,Java,Postgresql,Flyway,Embedded Database,我有一个postgres数据库,已经定义了用户和角色。该数据库中有多个模式,都是通过不同的项目/flyway脚本控制的。我正在将Flyway集成添加到一个新项目中,我们将使用一个嵌入式Postgres实例进行测试 由于此实例上不存在这些用户/角色,因此需要在迁移脚本中创建它们。但是,由于这些用户/角色已经存在于我的操作数据库中,因此当他们尝试创建角色时,迁移将失败 我已经考虑过为此编写一个函数,但是该函数必须包含在任何使用嵌入式Postgres的项目中,并且必须跨多个代码库进行维护。这似乎很草率

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

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


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

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

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


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

Flyway难道不像Liquibase那样提供了一些先决条件吗?只有在前提条件为真或者您可以使用Postgres的insert。。。在冲突中,如果行已经存在,则不使用任何语法使语句不会失败。我没有从粗略的谷歌搜索中看到任何内容,也没有在Flyway的文档中看到任何明显的内容。这似乎是一个非常重要的特性,选项2似乎是最不黑的方式。由于这将在回调中完成,如果角色已经存在,它会失败吗?如何仅针对测试环境进行回调?我会让它使用一个单独的迁移脚本路径吗?我考虑过Java回调,因为使用SQL回调,它与解决方案一类似。1.实现回调2。在测试环境中,您配置Flyway配置以使用回调实现。配置取决于迁移在测试阶段的工作方式。命令行示例see flyway-callback=your.callback migrateaw,我明白了。这一部分在过去对我来说有点模糊,因为我们使用的是Spring Boot集成,所以不必对迁移脚本做任何花哨的事情。