Flyway Migrate [SQL] - 处理对象依赖关系

Posted

技术标签:

【中文标题】Flyway Migrate [SQL] - 处理对象依赖关系【英文标题】:Flyway Migrate [SQL] - Handling object dependencies 【发布时间】:2020-10-27 13:37:41 【问题描述】:

我有一个现有的数据库,我将其放入源代码控制中,并将使用 Flyway 来处理迁移。

对或错,一些视图、函数和存储过程相互依赖。

我的原始文件结构遵循这种格式;

R__SP__StoredProcOne
R__SP__StoredProcTwo
R__UDF__UserDefinedFunctionOne
R__UDF__UserDefinedFunctionTwo
R__V__ViewOne
R__V__ViewTwo

我的问题的一个例子是R__UDF__UserDefinedFunctionOne 依赖于R__UDF__UserDefinedFunctionTwo。但是由于他们的名字,R__UDF__UserDefinedFunctionOne 函数首先迁移,导致 Flyway 抛出一个错误,说它找不到。

我通过引入额外的编号来强制迁移顺序,从而缓解了这个问题。

但我觉得应该有更好的方法来执行此操作,或者在 Flyway 中进行设置,无论文件顺序如何,它都可以迁移。

我尝试了-mixed=true-group=true 参数,但无济于事。

【问题讨论】:

【参考方案1】:

可重复迁移应始终最后运行。这意味着,除了那些可重复迁移中的依赖项之外,任何其他现有依赖项都应该已经存在。

As per the documentation,可重复迁移确实是按照它们的描述、名称的顺序运行的,所以,是的,如果你对可重复迁移有依赖关系,使用命名标准来确保它们以特定顺序运行当前是解决方案。

【讨论】:

【参考方案2】:

我最近在考虑这个问题。我现在想写更多,我可能会在以后回来编辑。我还在研究flyway,你可以按文件夹订购吗?我的想法假设你可以。 (而且你现在完全有可能看不到。)

函数通常不依赖于其他对象。 它们可以放在自己的文件夹中,该文件夹将在其他脚本之前运行。

存储过程有时会依赖函数,所以如果在函数满的文件夹之后运行就可以了。

现在,调用其他存储过程的存储过程:假设有 2 个 proc 都依赖于另一个 proc。而且他们都依赖的一个过程不依赖于其他任何东西。 (或者它可能取决于一个函数。)我们可以将这些 proc 放在函数文件夹下的 another 文件夹中。并且这些 proc 总是在所有其他依赖它们的 proc 之前运行。

但是假设你有:

        A
      /   \
    B       C
  /   \       \
D       E       F

这是一个过程依赖图。关于左半部分,我们可以将 A 放在上述文件夹中。但是我们如何确保 B 总是在 D 和 E 之前运行呢?我想说你可以做 3 件事中的 1 件事:

    为依赖于 proc 和其他事物的事物创建第二个文件夹。那么你不希望依赖树的高度超过 3 级。 将 B 放在与 A 相同的文件夹中,并使用命名约定来确保排序。有了这个,我们减少了使用数字,但我们正在努力避免这种情况。 将依赖关系保持在 1 级深度。

有时提取和模块化会带来一些快乐。当使用这样的工具时,这可能会开始抬头。

和上面一样,为什么 B 必须是它自己的 proc?也许它应该是 A 的扩展。而 C 绝对不应该是一个东西(YAGNI)。这与您已经提到的内容相呼应:

对与错,一些视图、函数和存储过程相互依赖。

【讨论】:

以上是关于Flyway Migrate [SQL] - 处理对象依赖关系的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 2012 上的 Flyway 和清洁序列

如何在flyway migrate上回调?

flyway 后的 Flyway 迁移错误:基线

Flyway 不会将值插入数据库

使用 Flyway 进行集成测试

Flyway with Jenkins - 无法解析位置