使用SQL Compare命令行从源代码管理中进行自定义部署(下)

Giorgi Abashidze解释了他的团队如何将两阶段部署过程与SQL Compare命令行以及一些SQL同义词一起使用,以自动为其每个客户进行自定义部署,而只需要在源代码管理中为每个版本维护一个分支。

SQL Compare是一款比较和同步SQL Server数据库结构的工具。现有超过150,000的数据库管理员、开发人员和测试人员在使用它。当测试本地数据库,暂存或激活远程服务器的数据库时,SQL Compare将分配数据库的过程自动化。

SQL Compare正式版

在本教程中,我将解释如何使用SQL Compare命令行、同义词和一些独创性来完成所有这些工作。由于内容较多,分为上下两篇,本文内容紧接上文~


使用SQL Compare的两阶段部署

我们将在简化的部署示例中稍作扩展,并假设有三个客户(Cust1Cust2Cust3)都需要定制“有效利率”算法的变体。

部署过程的第一阶段将生成一个部署脚本,该脚本将交付给每个客户数据库并在每个客户数据库上运行。这将使所有通用数据库例程(即,没有名称以客户别名结尾的任何例程)升级到相同版本。

第二阶段生成零个或多个特定于客户的同步脚本,这些脚本仅创建或更新特定于该客户的SQL例程,这意味着任何例程的名称都以该消费者的别名结尾,在这种情况下,cust1cust2cust3。它还将删除并重新创建任何同义词,在本例中为effective_rate同义词,因此每个同义词始终绑定到正确的基础实现。

为了满足这些要求,我们对所需的每个同步脚本执行一次SQL Compare命令行。

阶段1:生成常规部署脚本

在部署过程的第一阶段,我们通过提供一个名为“shared.xml” 的XML argfile,仅执行一次SQL Compare CL,并传入指示其进行比较的数据库的所有参数,以及如何进行比较:

“%programfiles(x86)% Red Gate  SQL Compare 13  sqlcompare” /Argfile:"shared.xml“

我在上一篇文章中解释了此Argfile的基本内容,但重要的一点是,首先,它是直接从源代码控制位置比较数据库的两个即时点版本(新版本和先前版本) ,其次包括对相应过滤器文件(shared.scpf)的引用。此过滤器文件使用如下所示的过滤器表达式排除任何特定于客户的模式对象版本(在这种情况下,任何以Cust1Cust2Cust3结尾的版本):

(@NAME NOT LIKE '%[_]cust1') AND (@NAME NOT LIKE '%[_]cust2') AND (@NAME NOT LIKE '%[_]cust3')

当然,如果您的客户别名都遵循标准模式(如本简化示例中的做法),则可以使用更通用的过滤器,例如(@NAME NOT LIKE’ %[_]cust[0-9]’)。但是,我们所有的真实客户名称都不相同,因此不可能进行这种模式匹配。

因此,SQL Compare将生成一个SQL同步脚本,该脚本将仅创建effective_rate_default存储过程,然后删除effective_rate同义词,然后重新创建该同义词,以使其引用默认过程(CREATE SYNONYM effective_rate FOR effective_rate_default)。

我们将此脚本交付给每个客户。

阶段2:生成客户特定的部署脚本

实际上,对于每个客户,此阶段分为两个部分:

1、SQL Compare自动生成一个脚本,该脚本将创建或修改所需的特定于客户的例程

2、我们“重置”每个客户数据库中的所有同义词,以便它们引用正确的基础实现(存储过程或函数等)。为此,我们将所需的代码“注入”到每个自动生成的自定义脚本的末尾

我们针对需要自定义代码的每个客户再次执行SQL Compare CL,只需每次切换argfile即可指示SQL Compare 仅包含名称以该客户的别名结尾的对象。我们将所有客户别名的列表存储在开发数据库中。

"%programfiles(x86)%Red GateSQL Compare 13sqlcompare" /Argfile:"cust1.xml""%programfiles(x86)%Red GateSQL Compare 13sqlcompare" /Argfile:"cust2.xml""%programfiles(x86)%Red GateSQL Compare 13sqlcompare" /Argfile:"cust3.xml"

每个argfile的内容与shared.xml文件的内容几乎相同,唯一的区别是每个特定于客户的argfile包含对该客户的筛选器文件的引用(例如Cust1.scpf),该引用指示SQL Compare CL到使用以下表达式,仅检测特定于该客户的更改

(@NAME LIKE '%[_]cust1')

当比较运行时(例如对于Cust1),SQL Compare将生成一个部署脚本,该脚本将在代表Cust1安装版本的主干分支中创建、修改或删除任何* _cust1对象,因此它将与源代码管理中的最新版本同步。在这种情况下,它将创建effective_rate_cust1存储过程。

但是,对于每个客户,SQL Compare的自动生成的部署脚本不会将当前的effective_rate同义词(通过在阶段1中运行通用脚本创建)替换为引用有效_rate_cust1存储过程的同义词,因为这是Trunk或任何其他形式的同义词。 每个主要版本(v241,v242等)的单个分支始终引用默认实现。

因此,每次SQL Compare自动生成特定于客户的同步脚本时,我们都需要对其进行修改,以“重置”脚本中的任何同义词,以便它引用相关操作的特定于客户的实现,或者如果不再需要自定义变体,则恢复为默认操作。

我们不能为此使用标准的SQL比较部署后脚本,首先,因为直接与源控件位置进行比较时,该工具当前不支持使用它们。无论如何,由于我们简单的“每个版本一个分支”策略,我们无法动态地为每个客户生成一个部署后脚本,也无法更改每个脚本中的同义词以引用正确的客户实现。使其起作用的唯一方法是使用“每个版本的每个客户一个分支”的更复杂的构建方案,将每个分支脚本化到一个文件夹中,然后向其中添加一个后部署脚本,以为此重置同义词。

但是,我们更喜欢使用更简单的源代码控制方法,那么我们该怎么做呢当SQL Compare将特定于客户的同步文件写入我们选择的目录(由该客户的XML argfile中的out参数指定)时,我们有一个本地开发的工具可以打开该文件,并在自动生成的代码的末尾添加执行的行,我们编写的存储过程称为switch_synonyms_to_customer。 此过程接受组织的别名的参数(应将同义词绑定到该参数),然后遍历所有SQL同义词,将它们逐个删除,然后使用同义词引用的基础对象的适当名称重新创建它们。 默认值之一或专用例程(如果特定客户需要)。

因此,对于cust1

EXEC altasoft.switch_synonyms_to_customer @alias = 'cust1'

对于cust2

EXEC altasoft.switch_synonyms_to_customer @alias = 'cust2'

等等…

为每个客户运行部署

我们向每个客户提供用于部署所有公共对象的常规部署脚本,如果需要,我们还为每个客户提供为其定制逻辑提供的其他自定义部署脚本,该脚本还将正确重置所有同义词。他们必须始终首先运行常规脚本,只有完成后才运行其自定义脚本。

结论

如果您正在为许多不同的客户开发数据库应用程序,那么您的客户的需求将开始出现分歧,并且单个部署无法满足您的需求。毕竟,当地的税收和法律以及不同的商业惯例将决定客户如何计算某些财务价值。

为了将所需逻辑中的所有变体仅提供给需要它的客户,SQL Compare命令行可以完成所需工作的99%。它会生成一个通用同步脚本,以部署每个客户所需的从一个版本到另一个版本的任何更改,然后为每个有“特殊”要求的客户生成单独的同步脚本文件。

通过使用同义词表示每个必需的业务操作,并在每个特定于客户的同步脚本的末尾“手动”重置它们,以便它们始终引用此操作的正确实现,我们避免了对调用者进行任何更改码。

在每个发行版中,都有可能为客户创建了一些新逻辑,或者更新了现有的自定义逻辑或将其删除。如果某些操作不再需要自定义实现,则将其删除,因此客户将返回该操作的默认实现。

本教程内容到这里就完结了,感兴趣的朋友可以继续关注我们网站!您可以下载SQL Compare试用版体验一下~

相关内容推荐:

使用SQL Compare命令行从源代码管理中进行自定义部署(上)

SQL Compare教程:使用SQL Compare命令行从源代码管理到数据库


想要购买SQL Compare正版授权,或了解更多产品信息请点击【咨询在线客服】

使用SQL Compare命令行从源代码管理中进行自定义部署(下)

标签:

来源:慧都

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年1月12日
下一篇 2020年1月12日

相关推荐

发表回复

登录后才能评论