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] - 处理对象依赖关系的主要内容,如果未能解决你的问题,请参考以下文章