
文章插图
考虑到一些客户业务的性质,我们没有访问客户数据库或数据进行开发、测试或部署的权限 。在TFS源代码管理下,我们只有开发数据库及其人工测试数据 。开发人员在自己的数据库副本上工作,每个副本都有自己的示例数据,并且他们使用Redgate SQL Source Control提交开发更改 。然后,我们使用SQL Compare命令行来自动化数据库部署 。在本文中,我将解释如何实现此目标,并举例说明如何比较相同或不同分支中的数据库的两个修订版,并生成部署脚本 。
在源代码管理中管理数据库
我们的数据库源代码控制和分支策略很简单 。我们在Trunk中拥有最新的代码库;整个应用程序都在那里,包括其中的数据库部分 。所有新功能和错误修复最初都在Trunk中进行 。我们创建的每个分支只是Trunk的一个副本,因此代表了代码库的完整时间点状态 。在应用了一些更改并签入Trunk之后,我们可以根据需要将其合并到这些分支中的任何一个 。通常,这是为了修复已报告的错误,但当对我们的客户来说很重要时,我们还需要能够合并小的功能更改 。例如,并非每个客户都能负担得起部署每个版本的费用,因此他们部署的版本通常落后三个或四个版本 。但是,他们仍然需要我们为当前版本部署紧急修复程序,偶尔会使用一些“专有”功能 。
那么,当我们开发软件时,这一切如何工作?让我们将其称为“under-source-control-Application”(简称USCAPP) 。我们在USCAPP_Trunk中拥有最新的代码库,并在TFS分支下提供了一些发行版本,称为v241、v242等 。
直接或通过合并进行的所有更改都可以通过Trunk及其分支的普通TFS检入完成 。在每次签入时,TFS都会创建一个称为变更集的东西,它具有唯一的参考号 。变更集表示源代码管理中整个代码库的快照 。像任何其他源代码控制系统一样,TFS可以针对任何给定的变更集编号,为任何修订生成代码库的时间点状态 。
当然,对于集合中的所有TFS项目(包括其分支机构),TFS变更集编号都是全局的,并且每次对该项目集合进行每次检入时,TFS变更集编号都将逐渐增加 。对我们来说,这意味着USCAPP_Trunk及其所有分支v241、v242等都共享相同的、全球的、不断增长的变更集号 。
开发人员进行更改,每个人都在自己的专用数据库上工作,并通过SQL Source Control签入更改,这些更改将更新USCAPP_Trunk中的代码 。根据需要,我们将所需的变更集合并到其他分支,在这些分支中创建新的变更集 。因此,假设最新版本为v245,并且我们知道客户A已将v242部署到生产环境中 。该客户尚不能升级到最新版本,但已部署了一个附加的升级脚本以修复一些错误并进行一些小的改进 。换句话说,客户A正在运行非常特定的v242版本,我们可以将其转换为TFS变更集编号,该编号唯一地标识其已部署的分支v242的代码库的时间点状态 。
使用SQL Compare命令行自动生成更改脚本
我们的目标是使生成同步SQL脚本的过程自动化,该脚本覆盖自上次发布脚本以来发生的所有更改 。
假设客户A已经部署了分支v242,并且该数据库的发行版本标记有人类可读的版本号2.4.2.0,该版本号对应于变更集编号87300,即它是在变更集87300是当前最新版本时发布的代码库的全局变更集编号 。
此后一个月过去了,我们已经在数据库中进行了更改,现在TFS中当前的更改集数量为88100 。现在,我们要生成一个脚本,其中包含当月所做的每个更改,因此将数据库的v2.4.2.0升级到变更集编号88100表示的状态,我们将其称为v2.4.2.1 。
为此,我们需要从TFS中检索数据库的两个时间点状态,一个代表源数据库(不会改变),另一个代表目标数据库(我们要升级) 。因此,对于客户A,变更集88100代表源,而87300代表目标 。我们需要比较这两种状态以找出差异,然后生成一个脚本以同步目标,以便其状态与源相同 。对于两个数据库中都存在但有差异的任何数据库对象,必须更改目标中对象的定义以匹配其在源中的定义 。应该创建源中存在但目标中不存在的任何对象,应该删除目标中存在但源中不存在的任何对象 。
好消息是,我们不必手动执行此操作 。SQL Compare GUI和SQL Compare命令行均支持此功能 。我们希望使该过程自动化,因此我们使用命令行并将适当的参数传递给该命令行以生成同步脚本 。我们还需要仔细记录该脚本将数据库的2.4.2.0版本升级到v2.4.2.1 。当然,这里我们也需要一些保护措施 。其中一项是检查,该检查将停止在不是v2.4.2.0的任何数据库上运行此脚本 。在这里,我不会进行演示,但是最后,我将更详细地讨论这些需求 。
推荐阅读
- 数据库教程-SQL Server多条件模糊查询
- 首批受权使用浙江绿茶标识茶企名单公布
- 这样用毛巾细菌超百万!这份“使用手册”值得收藏
- 搜狐新闻小爬虫,解析数据接口并插入mysql数据库
- MySQL性能优化之骨灰级高阶神技
- 10款最佳的MySQL GUI工具,数据库管理员的好帮手
- SEO中的假设检验及其统计意义
- mysql 分区表使用介绍
- 虚拟服务器端口映射的设置方法
- MySQL主从复制没使用过?三大步骤让你从原理、业务上理解透彻
