65.9K
CodeProject 正在变化。 阅读更多。
Home

为什么要将数据库放入源代码控制?

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0投票)

2014 年 10 月 1 日

CPOL

7分钟阅读

viewsIcon

22900

Grant Fritchey 认为,将数据库置于源代码管理之下不仅对开发和部署的稳定性至关重要,而且在出现问题时,它会让您的生活更轻松。

引言

对于大多数开发人员来说,将程序代码签入源代码管理是日常习惯,但数据库代码的版本控制却鲜为人知。Grant Fritchey 认为,将数据库置于源代码管理之下不仅对开发和部署的稳定性至关重要,而且在出现问题时,它会让您的生活更轻松。

软件开发是一项困难且要求很高的工作。当您将开发团队集中在一个项目上时,它会变得更加困难。其中一个基本问题围绕着代码本身。谁对哪部分代码负责?他们做了哪些更改?您如何将这些更改从团队的一名成员传递给另一名成员?您如何保留每次更改的历史记录,以防以后出现需要追踪和修复的问题?所有这些问题以及更多问题的答案是:通过源代码管理系统来管理您的代码。

源代码管理系统,也称为版本控制系统(VCS)或修订控制系统,可以追溯到现代计算的诞生。最早开发的一个是在 1975 年,当时终于有足够的磁盘空间来存储程序的第二个副本,以防万一。从那时起,将应用程序代码纳入源代码管理已经超越了行业标准实践,成为编程的一部分,就像编写函数或 IF 子句一样。是的,有一些公司或个人开发人员不为他们的代码使用源代码管理,但这些是明显的例外,证明了代码进入源代码管理的几乎普遍规则。

但数据库不同。

数据库的历史与代码的历史有所不同。在某个时候,开发人员不再负责数据库。相反,它们落入了系统管理员或专门的数据库管理员手中,坦率地说,他们看待世界的方式与开发人员截然不同。他们花时间担心备份、可用性、完整性和性能。

在许多情况下,数据库开发工作转移到了 DBA 的领域。虽然许多 DBA 来自开发人员队伍,但他们花费更多时间担心所有这些管理任务而不是开发任务,并且为管理代码创建的一些最佳实践和方法根本没有应用于数据库。但它们应该被应用。

备份

DBA 非常擅长实施备份方案来保护生产数据。然而,在处理数据库代码时(定义数据结构和存储过程的 SQL 代码),完整的数据库备份是一种笨拙的方式来维护模式副本,用于检索更改和历史跟踪。例如,要找出存储过程的先前版本和当前版本之间发生了什么变化,DBA 将被迫使用可以与备份直接比较的第三方工具,或者将数据库完全恢复到辅助位置,然后提取存储过程定义。这并不总是可能的,它通常不切实际,而且肯定会很慢。

将数据库置于源代码管理之下,为备份数据库的 SQL 代码提供了一种更有效率的机制。检索存储过程的先前版本,只需检查 VCS 中更改的历史记录即可。检索几乎是即时的。

一旦您意识到您的 SQL 是代码,那么使用代码所使用的相同备份机制(即 VCS)就立刻说得通了。

审计

在大多数数据库管理系统中,可以查明对象何时创建或上次修改,以及哪个登录执行了该操作。但是,通常没有该对象任何先前修改的历史记录。此外,根据数据库中的安全机制,您可能只会看到系统管理员或数据库所有者进行了更改,但没有指示在该角色中工作的实际人员身份。

如果您将数据库置于版本控制系统 (VCS) 中,并将其作为开发和部署机制的基本组成部分,那么它将提供这种类型的跟踪。所有更改都源于 VCS,并且不会在 VCS 周围的流程之外直接针对生产系统进行。您将知道是谁在何时进行了何种更改。

许多组织必须遵守变更审计的法律要求,例如萨班斯-奥克斯利法案所规定的要求。实施 VCS 可能是提供所需级别的所有变更历史跟踪的最快捷、最简单的方法,这样对于数据库的每次变更,您都能知道是谁在何时进行的。

集成

一旦我们将新的代码文件输入到 VCS 中,它就会为其分配一个版本。每次我们提交对该文件的更改时,版本都会递增,并且我们可以访问该文件的当前版本和所有先前版本。当我们把数据库放入 VCS 中时,这意味着 VCS 中的每个数据库对象(表、视图、存储过程等等)都有一个版本号。我们还可以创建标签,允许我们为构成数据库特定版本的文件集分配一个有意义的“构建号”。

此外,将数据库直接与应用程序一起置于源代码控制之下,将把数据库更改与应用程序代码更改集成起来,这样您将始终知道所部署的数据库版本直接对应于所部署的应用程序版本。这种直接集成有助于确保团队之间更好的协调,并且在排查问题时也会有所帮助。

自动化部署

如果生产系统所需的所有更改都存储在某个开发数据库中,而不是在版本控制系统 (VCS) 中,那么部署必然会是手动操作。您需要一个从开发数据库生成更改的过程,以便使生产数据库镜像较新的设计。有一些第三方产品可以提供帮助,但是您如何区分旨在随一个版本发布的版本与旨在随不同代码版本发布的版本?在开发数据库中,这通常是不可能的,因为在该数据库中没有清晰简便的方法来区分对象更改。

一旦您开始从源代码控制生成部署脚本,许多机会就会随之而来。您将能够将数据库对象区分成已知版本,从而可以控制部署的内容。一旦您可以控制部署的内容,就可以对部署过程实施自动化。您将能够利用持续集成以及应用程序代码已经使用的其他自动化部署和测试机制。自动化部署还意味着对这些部署进行更多的测试和验证,这有助于确保最终部署到生产环境成功。

结论

由于定义数据库的 SQL 是代码,因此利用现有且成熟的代码管理机制是理所当然的。您将拥有更好的方式来备份代码,更重要的是,检索该代码的先前版本。数据库的源代码管理提供了审计跟踪,有助于故障排除和法律合规性。通过共享源代码管理,您将更好地与应用程序代码集成。最后,您将能够自动化部署。所有这些理由都使将数据库置于源代码管理之下成为一项明智之举,有助于改善组织内系统的管理。

SQL 源代码管理基础

如果您希望继续深入研究数据库源代码管理,本电子书详细介绍了相关概念,并附有代码示例。

下载免费电子书

本文最初发布于 Simple-Talk,一个技术期刊和社区中心。

© . All rights reserved.