按顺序进行可重复迁移

Repeatable Migration in Order

需求:需要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都是需要在新DB中创建的新函数

所以问题是当通过 Flyway 执行时它创建 FN_ABC 作为 First 并且它失败了因为 FN_ID 不存在

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

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

这显然不理想,因为该文件会变得非常大和复杂,所以我希望有人能回答一个更好的解决方案。

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

相关: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

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

  • R__01_my_first_repeatable_script.sql
  • R__02_my_second_repeatable_script.sql
  • R__03_my_third_repeatable_script.sql