使用SQL Compare命令行来自动化数据库部署( 二 )


比较同一分支中的两个修订
首先,我将描述我们如何发布称为“修复”的脚本,该脚本主要用于部署一些错误修复和较小的改进 。主要版本保持不变 。
我们使用SQL Compare命令行进行此操作,传递一个XML参数文件(argfile),该文件包含指示SQL Compare如何执行比较的所有必需命令行开关的值 。或者,您可以指定每一个到命令行的开关,或在PowerShell中“splat”参数 。
在这种情况下,唯一需要传递给SQL Compare的参数是XML Argfile的合格文件名,称为“shared.xml”
“%programfiles(x86)% Red GateSQL Compare 13sqlcompare” /Argfile:"shared.xml“argfile的内容应完全按照SQL Compare命令行的在线文档中的说明填写 。这是真实的示例:
<commandline> <SourceControl1 /> <Revision1>88100</Revision1> <SourceControl2 /> <Revision2>87300</Revision2> <Options>NoDeploymentLogging,IgnoretSQLt,IgnoreFillFactor,IgnoreWhiteSpace,IgnoreFileGroups,IgnoreUserProperties,IgnoreWithElementOrder,IgnoreDatabaseAndServerName,CaseSensitiveObjectDefinition,ObjectExistenceChecks,DropAndCreateInsteadofAlter,ForceColumnOrder,DoNotOutputCommentHeader,IgnoreUsersPermissionsAndRoleMemberships</Options> <ScriptsFolderXML>Command LineSourceControlAddress v242.xml</ScriptsFolderXML> <Filter>Command LineFiltersShared.scpf</Filter> <ReportType>Interactive</ReportType> <Report>Command LineOutputShared.html</Report> <ScriptFile>Command LineOutputShared.sql</ScriptFile> <Force /> <Verbose /></commandline>Argfile包含五个命令行开关,我们使用它们来定义所需的行为 。/ Sourcecontrol1和/ Sourcecontrol2切换指定我们的源,和目标,是源控制脚本的一个文件夹,在这种情况下,版本分别为88100和87300 。
<SourceControl1 /><Revision1>88100</Revision1><SourceControl2 /><Revision2>87300</Revision2>所述<ScriptsFolderXML>开关包含完整的文件路径为XML文件,SourceControlAddress v242.xml 。该文件如下所示,包含分支v242的数据库的源代码控制地址:
<?xml version="1.0" encoding="utf-16" standalone="yes"?><ISOCCompareLocation version="1" type="TfsLocation"> <ServerUrl>http://tfs:8080/tfs/projects</ServerUrl> <SourceControlFolder>$/USCAPP/Branches/v242/Database/Schema</SourceControlFolder></ISOCCompareLocation>这是SQL Compare应从中恢复87300和88100变更集的地址 。当执行SQL Compare的命令行版本时,它将把这些变更集还原为“脚本文件夹”(在撰写本文时,还原到windows Temp中的文件夹中),并使用88100作为源和87300作为目标进行比较,以生成最终的升级脚本 。
比较两个不同分支中的数据库
我们用来发布已经在Trunk中完成的所有新功能的过程与错误修正版本稍有不同,但是主要概念保持不变 。同样在这种情况下,我们必须比较数据库架构的两个不同状态 。即使它们的“真理来源”作为TFS源代码管理中的版本存在,它们也被导出到文件夹,作为Redgate称为“脚本文件夹”的东西 。然后可以将它们作为两个数据库模式进行比较 。在这种情况下,不同之处在于我们不是在一个TFS分支中比较由变更集表示的两个修订版(或时间点状态),而是在现在表示版本的两个分支之间进行比较 。
要逐步进行:该过程首先从Trunk分支中创建一个新分支,并为其指定一个适当的名称 。例如,如果v2.4.2是USCAPP应用程序的最后发行版本,那么在发行该版本时,我们已经创建了一个名为v242的分支 。现在,我们已经对Trunk进行了更多更改,从逻辑上讲,我们将发布v2.4.3版本,因此我们的新分支将称为v243,从那时开始,就其所包含的内容而言,它将作为Trunk分支的确切副本 。
【使用SQL Compare命令行来自动化数据库部署】现在,我们应该比较两个单独分支的两个变更集 。我们用于比较的变更集必须是刚刚创建的新v243分支的变更集,并且是客户A已应用的上一个分支v242的最新发布的部署脚本所对应的变更集 。此比较将揭示仅在Trunk的数据库上发生的更改,而上一个分支v242的数据库中缺少这些更改 。
为此,我们需要指定一个而不是两个源代码管理文件夹位置,一个用于包含源/ ScriptsFolderXML1的TFS分支,另一个用于包含目标/ ScriptsFolderXML2的分支 。我们使用SQL Compare保留关键字“HEAD”来指定我们想要源分支的最新的源控件更改集 。生成的Argfile如下所示:
<commandline> <SourceControl1 /> <Revision1>HEAD</Revision1> <SourceControl2 /> <Revision2>88100</Revision2> <Options>NoDeploymentLogging,IgnoretSQLt,IgnoreFillFactor,IgnoreWhiteSpace,IgnoreFileGroups,IgnoreUserProperties,IgnoreWithElementOrder,IgnoreDatabaseAndServerName,CaseSensitiveObjectDefinition,ObjectExistenceChecks,DropAndCreateInsteadofAlter,ForceColumnOrder,DoNotOutputCommentHeader,IgnoreUsersPermissionsAndRoleMemberships</Options> <ScriptsFolderXML1>Command LineSourceControlAddress v243.xml</ScriptsFolderXML1> <ScriptsFolderXML2>Command LineSourceControlAddress v242.xml</ScriptsFolderXML2> <Filter>Command LineFiltersShared.scpf</Filter> <ReportType>Interactive</ReportType> <Report>Command LineOutputShared.html</Report> <ScriptFile>Command LineOutputShared.sql</ScriptFile> <Force /> <Verbose /></commandline>


推荐阅读