按顺序可重复迁移
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_ABC
和FN_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【讨论】:
以上是关于按顺序可重复迁移的主要内容,如果未能解决你的问题,请参考以下文章