【发布时间】:2018-10-03 20:38:58
【问题描述】:
当我在中间进行了 60 或 70 次迁移并且我不想/不能进行完全回滚时,如何强制重新运行 3 个月前的迁移?
显然,提供我希望它重新运行的值的 --version 参数不起作用,并且仅从 VersionInfo 表中删除该值也不起作用(两者一起完成似乎也没有任何好处)。
有没有办法让 FluentMigrator 从几个月前重新运行一次迁移?我是不是在挑剔这个问题?
【问题讨论】:
标签: fluent-migrator
当我在中间进行了 60 或 70 次迁移并且我不想/不能进行完全回滚时,如何强制重新运行 3 个月前的迁移?
显然,提供我希望它重新运行的值的 --version 参数不起作用,并且仅从 VersionInfo 表中删除该值也不起作用(两者一起完成似乎也没有任何好处)。
有没有办法让 FluentMigrator 从几个月前重新运行一次迁移?我是不是在挑剔这个问题?
【问题讨论】:
标签: fluent-migrator
我不确定(在非生产环境中谨慎尝试),但您可以欺骗 fluentmigrator 更改 versionInfo 表。
将您不想执行的迁移添加到 versionInfo 中
最后,确保您要执行的迁移不在 versionInfo 表。
当然,最好在进行任何更改之前导出或备份 versionInfo 表。
【讨论】:
对于未来的读者,
FluentMigrator 将查看最新的迁移 AppliedOn 日期,然后从那里继续,因此,如果您的迁移是几个月前的,即使您从 versioninfo 表中删除该条目,它也不会重新运行迁移。
您可以作弊的方法是再次添加迁移,但这次添加的是防御性编码。即,如果您要应用的更改已经应用,则不要再尝试这样做。我不知道您的迁移情况如何,但这里有一个我所说的防御性编码的例子:
IF COL_LENGTH('FollowOnProduct', 'ProductType') IS NULL
BEGIN
ALTER TABLE FollowOnProduct
ADD ProductType VARCHAR(64) NULL
END
如果 ProductType 已经存在,这不会改变表并尝试添加列。
免责声明:这是一个 hack,先在 dev/test 上测试您的迁移,然后在 uat/production 上运行它们,在完美的世界中我们不应该做这些事情,但我们并不是生活在完美的世界中。
【讨论】: