我目前正在使用 Flyway 命令行工具来管理我们的脚本,这些脚本将通过我们的 CI 构建服务器触发的发布过程来调用。
问题是我有 274 个可重复的迁移,涵盖包规范、包主体、函数、过程、视图和物化视图。
当我运行 migrate 时,一切都会按预期工作,执行迁移后执行任何更改的可重复迁移,但可以说在下一个版本中,我们想要删除其中一个可重复迁移所维护的对象。例如,我们要删除定义ProcedureOne 的可重复脚本(即R__ProcedureOne.sql)。
为此,我将有一个新的迁移脚本 (V3.1.5.1.01__DropProcedureOne.sql),但我还将删除可重复的迁移脚本,以便不会再次创建和维护对象。
但是,执行 Flyway Info 显示 R__ProcedureOne.sql 脚本的状态为 MISSING。
虽然我同意它丢失了,但将其删除是有意的行为,因为不再需要它而不是被放错地方。
我知道迁移选项ignoreMissingMigrations,但我认为使用它会带来风险,并可能掩盖真正丢失的文件。
关于如何最好地删除可重复脚本的一般指南是什么?
我建议您简单地保留该文件,但将其设置为空(即零字节)。或者在文件中添加注释,说明它所代表的对象已被删除。
至于实际删除它,您建议的另一个选择可能是更新可重复迁移以删除自身,然后再次更新到零长度。这样做的优点是能够重播到空数据库中;由于可重复迁移是在版本化之后应用的,因此示例中的过程将不会被删除。缺点是运行两次迁移。
可重复迁移在所有其他迁移之后应用,因此我正在执行以下操作以避免出现空的可重复迁移文件:
DROP PACKAGE ProcedureOne
)SCHEMA_VERSION
表中删除可重复迁移行(script
列包含可重复脚本文件名,例如DELETE FROM T_SCHEMA_VERSION where "script"='R__ProcedureOne.sql'
)R__ProcedureOne.sql
)运行Flyway时,操作将按照上面定义的顺序执行。
您的数据库不会保留
ProcedureOne
或 R__ProcedureOne.sql
曾经存在的信息,但您当前版本的代码仍然包含 DELETE FROM T_SCHEMA_VERSION
,这会指示您何时删除 ProcedureOne
(然后您可以拥有查看 Git 历史记录,了解此过程在删除之前的情况)。