flyway迁移[sql]-处理对象依赖关系

u59ebvdq  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(328)

我有一个现有的数据库,我正在将其放入源代码管理,并将使用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 参数,但没有用。

kpbwa7wx

kpbwa7wx1#

可重复的迁移应该总是最后运行。这意味着,除了这些可重复迁移中的依赖关系之外,任何其他现有的依赖关系都应该已经存在。
根据文档,可重复迁移确实是按照其描述、名称的顺序运行的,因此,是的,如果您对可重复迁移有依赖关系,那么使用命名标准来确保它们按特定顺序运行是当前的解决方案。

bvuwiixz

bvuwiixz2#

我最近在想这个问题。我想写更多的比我现在,我可能会回来编辑在以后的时间。我还在研究飞行路线,你能按文件夹订购吗?我认为你可以(现在你完全有可能看不到。)
函数通常不依赖于其他对象。它们可以放在自己的文件夹中,该文件夹将在其他脚本之前运行。
存储过程有时依赖于函数,因此如果它们在充满函数的文件夹之后运行,那就没问题了。
现在,调用其他存储过程的存储过程:假设有两个过程都依赖于另一个过程。他们都依赖的一个过程并不依赖于其他任何东西(或者它可能取决于一个函数。)我们可以把这样的进程放在函数文件夹下的另一个文件夹中。这些进程总是在依赖它们的所有其他进程之前运行。
但假设你有:

A
      /   \
    B       C
  /   \       \
D       E       F

这是一个过程依赖关系图。关于左半部分,我们可以在前面提到的文件夹中放置一个。但是我们如何确保b总是在d和e之前运行呢?我想说你可以做三件事中的一件:
为依赖于进程和其他事物依赖的事物创建第二个文件夹。那么您就不想让依赖树的高度超过3级。
将b和a放在同一个文件夹中,并使用命名约定来确保排序。有了这一点,我们减少了使用数字,但我们正试图避免这种情况。
将依赖关系保持在1级深度。
有时在提取和模块化中会有一些触发快乐。当使用这样的工具时,也许它开始后脑勺了。
如上所述,为什么b必须是它自己的proc?也许它应该是a的延伸。c绝对不应该是一个东西(雅格尼)。这和你刚才提到的一样:
不管是对是错,有些视图、函数和存储过程相互依赖。

相关问题