SO 社区 wiki 上有一些关于数据库对象是否应该进行版本控制的讨论。然而,我还没有看到太多关于为数据库对象创建构建自动化过程的最佳实践的讨论。
对于我的团队来说,这一直是一个有争议的讨论点 - 特别是因为开发人员和 DBA 在评估数据库部署自动化方法的好处和风险时通常有不同的目标、方法和关注点。
我想听听 SO 社区关于哪些实践在现实世界中有效的想法。
我意识到哪种做法真正最好是有点主观的,但我认为关于什么工作的良好对话可能对很多人都有帮助。
以下是我对本主题关注领域的一些预告问题。这些并不是一个明确的列表,而是一个帮助人们理解我正在寻找的内容的起点。
- Should both test and production environments be built from source control?
- 两者都应该使用自动化来构建 - 还是应该通过从稳定的最终测试环境复制对象来构建生产?
- 您如何处理部署脚本中测试环境和生产环境之间的潜在差异?
- 如何测试部署脚本在生产中是否像在测试中一样有效?
- What types of objects should be version controlled?
- 只是代码(过程、包、触发器、java 等)?
- Indexes?
- 限制?
- 表定义?
- 表更改脚本? (例如,更改脚本)
- 一切?
- Which types of objects shouldn't be version controlled?
- How should database objects be organized in your SCM repository?
- 您如何处理一次性的事情,例如转换脚本或 ALTER 脚本?
- 如何处理从数据库中退休的对象?
- 谁应该负责促进对象从开发到测试级别?
- 您如何协调多个开发人员的变更?
- 如何处理多个系统使用的数据库对象的分支?
- What exceptions, if any, can be reasonable made to this process?
- 安全问题?
- 存在去识别化问题的数据?
- 无法完全自动化的脚本?
- How can you make the process resilient and enforceable?
- 开发者错误?
- 意想不到的环境问题?
- 用于灾难恢复?
- How do you convince decision makers that the benefits of DB-SCM truly justify the cost?
- 传闻?
- 行业研究?
- 行业最佳实践建议?
- 向公认的权威机构提出上诉?
- 成本效益分析?
- Who should "own" database objects in this model?
以下是对您的问题的一些回答:
- Should both test and production environments be built from source control? YES
- 两者都应该使用自动化来构建 - 还是应该通过从稳定的最终测试环境复制对象来构建生产?
- 两者的自动化。不要在环境之间复制数据
- 您如何处理部署脚本中测试环境和生产环境之间的潜在差异?
- 使用模板,这样实际上您将为每个环境生成不同的脚本集(例如对外部系统、链接数据库的引用等)
- 如何测试部署脚本在生产中是否像在测试中一样有效?
- 您在预生产环境中测试它们:在生产环境的精确副本(数据库和可能的其他系统)上测试部署
- What types of objects should be version controlled?
- 只是代码(过程、包、触发器、java 等)?
- Indexes?
- 限制?
- 表定义?
- 表更改脚本? (例如,更改脚本)
- 一切?
-
Everything, and:
- 不要忘记静态数据(查找列表等),因此您不需要在环境之间复制任何数据
- 仅保留数据库脚本的当前版本(当然是版本控制的),并且
- 存储ALTER脚本:1个大脚本(或名为001_AlterXXX.sql的脚本目录,以便以自然排序顺序运行它们将从版本A升级到B)
- Which types of objects shouldn't be version controlled?
- 序列?
- Grants?
- 用户帐户?
- 请参阅 2。如果您的用户/角色(或技术用户名)在环境之间不同,您仍然可以使用模板编写它们的脚本(请参阅 1。)
- How should database objects be organized in your SCM repository?
- 您如何处理一次性的事情,例如转换脚本或 ALTER 脚本?
- see 2.
- 如何处理从数据库中退休的对象?
- 从数据库中删除,从源代码控制主干/提示中删除
- 谁应该负责将对象从开发提升到测试级别?
- 开发/测试/发布时间表
- 您如何协调多个开发人员的变更?
- 尽量不要为每个开发人员创建单独的数据库。你使用源代码管理,对吗?在这种情况下,开发人员更改数据库并签入脚本。为了完全安全,请在夜间构建期间从脚本重新创建数据库
- 如何处理多个系统使用的数据库对象的分支?
- 艰难的一件事:不惜一切代价尽量避免。
- What exceptions, if any, can be reasonable made to this process?
- 安全问题?
- 不要存储测试/生产的密码。您可以允许开发人员使用它,特别是如果您每天/每晚都自动进行数据库重建
- 存在去识别化问题的数据?
- 无法完全自动化的脚本?
- 使用发布信息/ALTER 脚本记录并存储
- How can you make the process resilient and enforceable?
- 开发者错误?
-
从头开始进行每日构建测试,并将结果与增量升级(使用 ALTER 从版本 A 升级到版本 B)进行比较。比较结果模式和静态数据
- 意想不到的环境问题?
- 使用版本控制和备份
- 将 PROD 数据库架构与您想象的进行比较,尤其是在部署之前。 SuperDuperCool DBA 可能已经修复了您的票证系统中从未存在的错误:)
- 用于灾难恢复?
- How do you convince decision makers that the benefits of DB-SCM truly justify the cost?
- 传闻?
- 行业研究?
- 行业最佳实践建议?
- 向公认的权威机构提出上诉?
- 成本效益分析?
- 如果开发人员和 DBA 同意,我认为你不需要说服任何人(除非你需要钱购买像dbGhost http://www.innovartis.co.uk/products/products.aspx对于 MSSQL)
- Who should "own" database objects in this model?
- 开发商?
- DBAs?
- 数据分析师?
- 超过一个?
- 通常 DBA 会批准模型(在签入之前或作为代码审查的一部分之后)。他们肯定拥有与性能相关的对象。但总的来说,团队拥有它[当然还有雇主:)]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)