【问题标题】: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

【问题讨论】:

    标签: snowflake-cloud-data-platform database-migration flyway


    【解决方案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

      【讨论】:

        猜你喜欢
        • 2021-12-17
        • 1970-01-01
        • 2018-07-14
        • 2013-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-07
        • 2020-04-20
        相关资源
        最近更新 更多