软件开发是一项复杂且要求严格的工作,当多个开发团队协作一个项目时,问题会变得更加复杂。代码管理是其中的一个基本问题:谁负责代码的哪一部分?他们做了哪些更改?如何将这些更改从一个团队成员传递给另一个?如何记录每次更改的历史,以便在出现问题时能够追踪和修复?所有这些问题的答案,以及更多问题,都指向了通过源代码控制系统来管理代码。
源代码控制系统,也称为版本控制系统或修订控制系统,可以追溯到现代计算机的诞生。最早开发的版本控制系统之一是在1975年,当时终于有足够的磁盘空间来存储程序的第二份副本,以备不时之需。从那时起,将应用程序代码纳入源代码控制已经超越了行业标准实践,成为编程的一部分,就像编写函数或IF子句一样。是的,有些公司或个别开发者不使用源代码控制来管理他们的代码,但这些是明显的例外,证明了代码进入源代码控制的几乎普遍规则。
但数据库是不同的。数据库的历史与代码的历史不同。在某个时刻,开发者不再负责数据库。相反,它们转移到了系统管理员或专门的数据库管理员手中,他们看待世界的方式与开发者大相径庭。他们花时间担心备份、可用性、完整性和性能。
在许多情况下,数据库开发工作进入了数据库管理员的领域。虽然许多数据库管理员来自开发者的行列,但他们更多地担心所有这些管理任务,而不是开发任务,一些为管理代码而创建的最佳实践和方法并没有应用于数据库。但他们应该这样做。
数据库管理员非常擅长制定备份方案来保护生产数据。然而,当处理数据库代码时,定义数据结构和存储过程的SQL代码无非是代码,完整的数据库备份是一个笨拙的设备,用于维护架构的副本,用于检索更改和历史跟踪。例如,要找出存储过程的先前版本和当前版本之间发生了什么变化,数据库管理员将被迫使用第三方工具直接比较备份,或者运行完整的数据库还原到次要位置,然后提取存储过程定义。这并不总是可能的,它经常是不切实际的,它肯定是会很慢的。
将数据库纳入源代码控制提供了一种更有效的机制,用于备份数据库的SQL代码。检索存储过程的先前版本,只需检查版本控制系统中的变化历史。检索几乎是即时的。
一旦意识到SQL是代码,立即使用代码使用的相同备份机制,即版本控制系统,就有意义了。
在大多数数据库管理系统中,可以找出对象是何时创建或最后修改的,以及哪个登录执行了该操作。然而,通常没有对象先前修改的历史记录。此外,根据数据库内的安全机制,可能只知道系统管理员或数据库所有者进行了更改,而没有实际在该角色内工作的人的身份。
如果数据库在版本控制系统中,并且使用该版本控制系统作为开发和部署机制的基本部分,那么它将提供确切的跟踪类型。所有更改都源自版本控制系统,并且不会直接对生产系统进行更改,除非在围绕版本控制系统的过程中。将知道谁做了什么更改,以及何时进行的更改。
许多组织必须遵守法律要求的变更审计,如萨班斯-奥克斯利法案所规定的。实施版本控制系统可能是提供所需水平的历史跟踪的最快速和最简单的方式,以便对数据库的每次更改都知道是谁做的以及何时做的。
一旦将新代码文件输入版本控制系统,它就会为其分配一个版本。每次提交对该文件的更改时,版本就会增加,可以访问当前版本和所有先前版本的文件。当将数据库放入版本控制系统时,这意味着版本控制系统中的每个数据库对象(表、视图、存储过程等)都有一个版本号。还可以创建标签或标记,允许将有意义的“构建号”分配给构成数据库特定版本的一组文件。
此外,将数据库直接与应用程序代码一起放入源代码控制,将使数据库更改与应用程序代码更改集成,这样将始终知道正在部署的数据库版本直接对应于正在部署的应用程序版本。这种直接集成有助于确保团队之间的更好协调,并且可以帮助解决问题。
如果所有需要的生产系统更改都在某个开发数据库中,而不是在版本控制系统内部,部署将必然是一个手动事务。需要一个过程,将开发数据库中的更改生成,以便使生产数据库镜像新的设计。有一些第三方产品可以帮助,但是如何区分一个版本中应该发布的对象和应该发布到不同版本的代码的对象?从开发数据库内部来看,这通常是不可能实现的,因为数据库内没有明确且简单的方法来区分对象更改。
一旦开始从版本控制系统生成部署脚本,许多机会就会打开。将能够将数据库对象区分为已知版本,这将允许控制正在部署的内容。一旦可以控制正在部署的内容,就可以将自动化应用于部署过程。将能够利用持续集成和其他自动化部署和测试机制,这些机制已经用于应用程序代码。自动化部署还意味着对这些部署进行更多的测试和验证,这有助于确保最终部署到生产是成功的。
由于定义数据库的SQL是代码,因此利用现有的和管理代码的长期建立的机制是有意义的。将有更好的方法来备份该代码,更重要的是,检索该代码的先前版本。数据库的源代码控制提供了一个审计跟踪,以帮助故障排除和法律合规。将通过共享源代码管理获得更好的应用程序代码集成。最后,将能够自动化部署。所有这些原因使得将数据库纳入源代码控制成为提高组织内系统管理的明智之举。
如果想继续沿着数据库源代码控制的道路前进,这本电子书提供了概念的详细演练,包括代码示例。