按顺序可重复迁移

Posted

技术标签:

【中文标题】按顺序可重复迁移【英文标题】:Repeatable Migration in Order 【发布时间】:2021-10-30 07:38:49 【问题描述】:

需求:需要Flyway按顺序执行R脚本

问题:当我们将所有函数和过程迁移到新数据库时,一些函数在内部调用另一个函数,如下例所示

CREATE OR REPLACE FUNCTION ABC_SCHEMA.FN_ABC() RETURNS TABLE (
       COLUMNS
    ) LANGUAGE SQL AS '
      SELECT ID from TABLE(ABC_SCHEMA.FN_ID()) AS c

所以这里FN_ABCFN_ID这两个函数都是需要在新数据库中创建的新函数

所以问题是,当通过 Flyway 执行时,它会创建 FN_ABC 作为 First 并且由于 FN_ID 不存在而失败

如何解决这个问题,以便我可以先创建函数FN_ID,然后再创建FN_ABC

【问题讨论】:

【参考方案1】:

我找到的唯一解决方案是将所有依赖迁移放在一个文件中,然后按顺序执行。

这显然不理想,因为该文件可能会变得相当大和复杂,所以我希望有人能提供更好的解决方案。

【讨论】:

【参考方案2】:

想法是将所有定义放在一个文件中,并在开头定义为“存根”函数。

相关:Forward declaration - 参数列表和输出必须与实际匹配:

这里:

-- forward declaration, only signatures
CREATE OR REPLACE FUNCTION ABC_SCHEMA.FN_ABC() RETURNS TABLE (
       ID INT
    ) LANGUAGE SQL AS '
      SELECT NULL';

CREATE OR REPLACE FUNCTION ABC_SCHEMA.FN_ID() RETURNS TABLE (
       ID INT
    ) LANGUAGE SQL AS '
      SELECT NULL';

-- here actual definition in any order
CREATE OR REPLACE FUNCTION ABC_SCHEMA.FN_ABC() RETURNS TABLE (
       COLUMNS
    ) LANGUAGE SQL AS '
      SELECT ID from TABLE(ABC_SCHEMA.FN_ID()) AS c

【讨论】:

我可以在ABC_SCHEMA.FN_ABC() 的实际定义之前只对ABC_SCHEMA.FN_ID() 进行前向定义吗?或者我应该将这两个函数都定义为前向函数? @Karthik 我会为所有函数定义签名,因为将来您可能会拥有 ABC_SCHAME.FN_XYZ(dependend on FN_ABC) 在开始时定义所有签名应该更容易长期维护。 我将每个单独文件中的每个函数都维护为 R__** 脚本【参考方案3】:

您可以按顺序执行可重复的迁移,这只是您的文件如何命名的问题:

R__01_my_first_repeatable_script.sql R__02_my_second_repeatable_script.sql R__03_my_third_repeatable_script.sql

【讨论】:

以上是关于按顺序可重复迁移的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET 5 EF7 代码优先迁移默认按字母顺序创建列

插入..按[重复]顺序选择

java按字母顺序排序[重复]

按字母顺序排列的字典键[重复]

mysql按顺序生成一个不重复的id

java - 如何按顺序遍历地图[重复]