按顺序进行可重复迁移
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_ABC
和FN_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
需求:需要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
都是需要在新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