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



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

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

根据文档,可重复迁移确实按其描述、名称的顺序运行,因此,是的,如果您对可重复迁移有依赖关系,使用命名标准来确保它们按特定顺序运行是目前的解决方案。

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

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

存储过程有时依赖于函数,因此如果它们在充满函数的文件夹之后运行,那很好。

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

但是,假设您有:

A
/   
B       C
/          
D       E       F

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

  1. 为依赖于 proc 的内容和其他内容所依赖的内容创建第二个文件夹。然后,您不希望依赖树的高度超过 3 级。
  2. 将 B 放在与 A 相同的文件夹中,并使用命名约定来确保排序。有了这个,我们已经减少了使用数字,但我们正在努力避免这种情况。
  3. 将依赖项保持在 1 级深度。

有时在提取和模块化中会有一些触发快乐。也许在使用这样的工具时,这开始抬头。

像上面一样,为什么B必须是它自己的proc?也许它应该是A的扩展。C绝对不应该是一个东西(YAGNI(。这只是呼应了你已经提到的:

无论对错,某些视图、函数和存储过程相互依赖。

最新更新