彩票走势图

SQL Compare教程:在Argfiles中使用SQL Compare命令行(上)

翻译|使用教程|编辑:莫成敏|2019-10-21 14:30:30.540|阅读 299 次

概述:SQL Compar是一款比较和同步SQL Server数据库结构的工具。本文演示了如何使用XML argfiles将参数传递给SQL Compare,从而消除了每个目标数据库所需的许多修改数据库模式比较和部署过程所涉及的繁琐脚本教程的上半部分内容~

# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>

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

点击下载SQL Compare试用版

本文演示了如何使用XML argfiles将参数传递给SQL Compare,从而消除了每个目标数据库所需的许多修改数据库模式比较和部署过程所涉及的繁琐脚本。

有很多方法可以使用PowerShell自动执行需要执行SQL Compare的许多常规开发工作。您选择的方法取决于您的要求。本文旨在指出当您从命令行界面(CLI)运行XML时,使用XML将详细指令传递给SQL Compare的一些优点。教程内容较多,本文为上半部分内容~

SQL Compare教程:在Argfiles中使用SQL Compare命令行(上)

将参数传递给SQL Compare CLI

SQL Compare CLI允许您从XML参数文件(argfile)或使用项目文件传递参数,以及在命令行末尾使用开关的更常用方法。如果您需要大量参数但无法从GUI生成项目文件,那么这个功能很有用。

使用XML argfile传递参数的原因有很多。自动生成项目文件不是一个好主意,而XML argfile是受支持的。这意味着您可以从头开始为每个任务创建XML argfile,并且可以按计划执行所有任务。您还可以使用SQL Compare有时需要的所有许多细节来执行一般任务,而只需填写更改的细节(例如服务器、数据库或凭据),而所有其他选项、开关等保持不变。我在使用Linux或Windows上的SQL Compare命令行比较和部署SQL Server数据库,并给出了所有这些说明。

我们可以总结这些方法的一些优点和缺点。

方法好处缺点
项目文件
  • 与GUI的良好集成

  • 密码加密

  • 只需在GUI中进行编辑

  • 支持其他技术未记录的选项

  • 每个操作的每个数据库都需要一个文件。

  • 无法更改参数

  • 专有无证格式

XML文件
  • 在PowerShell中轻松创建和修改

  • 在CLI上节省了大量输入

  • 允许在正则表达式中使用所有字符。

  • 使用XSLT轻松转换为其他格式

  • 不与GUI集成

  • 密码以纯文本格式存储

切换命令尾部
  • 周围有很多例子,用途广泛
  • 可能变得冗长而复杂,难以输入

  • 密码为纯文本。

  • 无法使用正则表达式中使用的某些字符,例如pipe(|)。

'Splatted'(在PowerShell中)
  • 轻松查看您的参数
  • 如果开关具有参数,SQL Compare仅接受溅射

使用PowerShell的XML方法入门

当重复很多或使用大量命令行选项时,使用XML argfile为命令行界面指定参数特别有用。这是用于SQL比较的简单XML参数文件(argfile):

<?xml version="1.0"?>
<commandline>
  <database1>FirstDatabase</database1>
  <server1>SecondHostname</server1>
  <database2>SecondDatabase</database2>
  <server2>SecondHostname</server2>
</commandline>

这里是一个更复杂的例子:

<?xml version="1.0" encoding="UTF-8"?>
<commandline>
   <sourcecontrol1 />
   <version1>HEAD</version1>
   <server2>TargetDBServer</server2>
   <database2>TargetDB</database2>
   <scriptsfolderxml>MyScriptFolderXml.sfx</scriptsfolderxml>
   <migrationfolderxml>MyMigrationFolderXml.mfx</migrationfolderxml>
   <include>Assembly</include>
   <include>FullTextCatalog</include>
   <include>Function</include>
   <include>Schema</include>
   <include>StoredProcedure</include>
   <include>Table</include>
   <include>View</include>
   <include>identical</include>
   <Synchronize />
</commandline>

将所有这些设置保存在XML argfile中之后,您可以从Bash、PowerShell或命令提示符执行它:

sqlcompare /Argfile:MyXMLfilename.xml

如果执行此操作,则可以添加的唯一其他命令行开关为/verbose/quiet。其余的必须在XML argfile中。这给我们带来了一些敏感信息的问题,例如密码,我们无法将其存储在XML argfile中,因此无法将其分别传递给CLI。稍后,我将向您展示如何解决此问题,但是如果您使用命令提示符或Bash,这仍然是一个问题。

指定开关

开关可以包含其开关名称(长或短形式)作为名称,以及其值作为XML值。如果您有多个值(例如/options开关中允许的值),则可以将它们用逗号分隔:

sqlcompare /Argfile:MyXMLfilename.xml

创建表示开关的更复杂的argfile键的最简单方法是检出等效的SQL Compare项目文件。我不知道为什么两者之间的XML结构和键有很大的不同,因为它们几乎并行工作。也就是说,大多数有趣且复杂的键都是相同的,您可以在它们之间剪切和粘贴。这使您可以在GUI中进行繁重的工作,保存项目文件,并挑选出代表所需开关的所需位。

从hash表中的参数列表创建Argfiles

对我而言,在PowerShell中创建这些XML argfile的最简单方法是将参数放入hash表中,并将其传递给帮助函数以将其转换为正确的XML格式。它消除了手工制作XML的许多烦人的错误。

<# Unless you like writing XML, the easiest way of creating these files in PowerShell is probably this. We just put our parameters into a hash table and pass it to a function. 
 #>
$MyParameters = @{
    'Database1' = 'Sigrid';
    'Server1' = 'MyFirstServer';
    'Database2' = 'Sigrid'
    'Server2' = 'MySecondServer';
    'userName1' = 'MyUsername1';
    'password1' = 'MyPassword1';
    'userName2' = 'MyUsername2';
    'password2' = 'MyPassword2';
    'report' = "${env:temp}\MyReport.html";
       'force' = $null;
    'reportType' = 'HTML';
    'loglevel' = 'Warning';
    'options' = 'default'
}
# just a helper function to translate the hash table to the XML format expected
# neither of the built-in cmdlets can cut it because they wrap the hash table up
Function SaveHashTableAsSQLCompareXML([hashtable]$TheHashTableParameters,[string]$WhereToStoreIt)
{
    $xmlDoc = [System.Xml.XmlDocument]'<?xml version="1.0"?>';
    $commandline = $xmlDoc.AppendChild($xmlDoc.CreateElement('commandline'));
    $TheHashTableParameters.GetEnumerator() | foreach {
        $Element = $commandline.AppendChild($xmlDoc.CreateElement($_.Name));
        if ($_.Value -ne $null) # if it is a switch with a parameter
        {
            $textNode = $Element.AppendChild($xmlDoc.CreateTextNode($_.Value));
        }
    }
    $xmlDoc.Save("$WhereToStoreIt"); #save it to the user temp area
}
SaveHashTableAsSQLCompareXML $MyParameters "${$env:temp}\Paramfile.xml"
sqlCompare /Argfile:"${env:temp}\Paramfile.xml" >"${env:temp}\summary.txt"
start "${env:temp}\MyReport.html" #display the HTML result report

用于常规比较任务的简单Argfiles

这是一些用于各种任务的argfile示例。对于未加密的密码,读者会有些不解,但稍后再解决。

编写新版本的脚本

<?xml version="1.0"?>
<commandline> <!-- Script out a new version of the script folder -->
  <database1>Sigrid</database1>
  <server1>MyFirstServer</server1>
  <userName1>MyUsername</userName1>
  <password1>MyP@55w0rd</password1>
  <makescripts>MyPathTo\Tryout</makescripts>
  <force/>
</commandline>

生成一个构建脚本

<?xml version="1.0"?>
<commandline> <!-- generate a build script -->
  <database1>Sigrid</database1>
  <server1>MyFirstServer</server1>
  <userName1>MyUsername</userName1>
  <password1>MyP@55w0rd</password1>
   <empty2/> 
  <scriptFile>MyPathTo\MyScriptFile.sql</scriptFile>
  <force/>
</commandline>

报告两个数据库之间的任何差异

<?xml version="1.0"?>
<commandline> <!--report on any differences between two databases -->
  <loglevel>Warning</loglevel>
  <password1>MyP@55w0rd</password1>
  <force />
  <Server2>MyOtherServer</Server2>
  <password2>MyP@55w0rd</password2>
  <userName2>MyUsername</userName2>
  <options>default</options>
  <Server1>MyFirstServer</Server1>
  <reportType>HTML</reportType>
  <userName1>MyUsername</userName1>
  <Database2>Sigrid</Database2>
  <Database1>Sigrid</Database1>
  <report>MyPathTo\MyReport.html</report>
</commandline>

编写并报告两个数据库之间的差异

<?xml version="1.0"?>
<commandline> 
<!-- Script out, and report on, the differences between two databases -->
  <loglevel>Warning</loglevel>
  <password1>MyP@55w0rd</password1>
  <force />
  <Server2>MyOtherServer</Server2>
  <password2>MyP@55w0rd</password2>
  <userName2>MyUsername</userName2>
  <options>default</options>
  <Server1>MyFirstServer</Server1>
  <reportType>HTML</reportType>
  <userName1>MyUsername</userName1>
  <database2>Sigrid</database2>
  <database1>Sigrid</database1>
  <exclude>Identical</exclude>  
  <scriptfile>MyPathTo\MyDatabaseBuild.sql</scriptfile>
  <report>MyPathTo\MyReport.html</report>
</commandline>

从数据库创建快照

<?xml version="1.0"?>
<commandline> 
<!-- make a snapshot of a database -->
  <Server1>MyFirstServer</Server1>
  <database1>Sigrid</database1>
  <userName1>MyUsername</userName1>
  <password1>MyP@55w0rd</password1>
  <loglevel>Warning</loglevel>
  <force />
  <makesnapshot>MyPathTo\MyDatabase.snp</makesnapshot>
  <options>default</options>
</commandline>

本教程内容较多,敬请期待后半部分内容~感兴趣的朋友可以下载SQL Compare免费版尝试一下~

相关内容推荐:

SQL Compare教程:如何在一个操作中重新格式化数据库

SQL Compare教程:使用SQL Compare来维护对象级源代码控制(下)

SQL Compare教程:使用SQL Compare来维护对象级源代码控制(上)


想要购买SQL Compare正版授权,或了解更多产品信息请点击



标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@pclwef.cn


为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP