在部署后脚本中使用已删除列中的值的最佳方法是啥
Posted
技术标签:
【中文标题】在部署后脚本中使用已删除列中的值的最佳方法是啥【英文标题】:What is the best way to use values from a dropped column in a post deployment script在部署后脚本中使用已删除列中的值的最佳方法是什么 【发布时间】:2014-09-15 12:16:39 【问题描述】:我们目前在自动构建期间使用数据库项目来确保我们的测试和开发数据库与源代码同步。
在发布配置文件期间,我们注意到了一个问题,我们当前使用的工作流程并未完全涵盖该问题,并且好奇管理此问题的最佳方法。
问题:
我们对数据库架构进行了重新设计,并决定将表 (user
) 中的列 (name
) 移至新表 (userdetail
)。
新的userdetail
表需要user
表上name
列的现有内容,但我们也希望从表用户中删除name
列。确保我们的数据库项目是最新的。
问题是,如果我们尝试在预部署中填充userdetail
表,userdetail
表不存在。我们可以在pre-deploy
中创建表,但是 db 项目在部署期间尝试再次创建它并失败。
如果我们尝试在部署后填充 userdetail
,name
列已被删除,我们不能使用它来填充 userdetail
。
目前我们可以看到两种可能的解决方案。
可能的解决方案 1
在user
表中保留name
列,这意味着userdetails
的填充运行正常,但是我们留下需要在部署后手动删除的列,这很容易出错。
可能的解决方案 2
创建一个临时表以在预部署期间捕获来自user
的信息,并将其存储以在部署后脚本期间使用。
在部署后删除临时表。
选项 2 目前似乎是最好的,但以后必须以这种方式手动存储和使用数据是一件很痛苦的事情。有没有推荐的方法来应对这种情况?
【问题讨论】:
听起来您的发布过程更新数据库架构(而不是重新创建它)。是对的吗?您的部署后是否插入了任何测试数据,或者您的开发人员和测试人员是否添加了现有数据? 发布配置文件更新而不是创建是的,这是一个遗留系统,因此我们仅在发布期间应用增量更改之后。我们的发布测试通常从上次发布时的实时数据副本开始,将架构更新到最新版本,然后在部署后,插入我们希望在发布后出现的任何种子类型数据. 【参考方案1】:我认为您最好的选择是选项 #2。运行发布命令时将生成“DROP”语句。这不会考虑任何部署前或部署后的脚本,因此在您有机会运行转换脚本之前,该列将被删除。您实际上只能选择在两个不同的构建中执行此操作,或者在部署前创建某种临时表并在部署后删除它。
【讨论】:
这也是我的想法,目前我的流程正如我所描述的那样工作,但希望有一种更明智的设置方式。可以向 MS 提交请求,因为能够使用“部署后依赖项”标记列/表以使其自动创建临时表并从中检索数据会很好。以上是关于在部署后脚本中使用已删除列中的值的最佳方法是啥的主要内容,如果未能解决你的问题,请参考以下文章
在 Java 中更改 XML 文件中的一个值的最佳方法是啥?