从WiX使用SQLCMD执行二进制SQL文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从WiX使用SQLCMD执行二进制SQL文件相关的知识,希望对你有一定的参考价值。

我正在尝试使用SQLCMD安装SQL脚本(SSDT) - 因为此脚本包含许多SSDT定义,并且无法由WIX SQL扩展运行。我希望我的SQL脚本文件是二进制的(因为我不希望它留在目标机器上)

如何设置SQLCMD命令以使用二进制脚本(使用-i)?

附:

我试过这个博客:http://neilsleightholm.blogspot.co.il/2008/08/executing-sqlcmd-from-wix.html##

但是此代码不显示二进制SQL文件和SCLCMD命令之间的链接。有人可以用正确的代码帮我吗?

这是我使用的代码,对我来说不起作用

<Binary Id="CreateSchema.sql"  SourceFile="..SQLCreateSchema.sql" />

<CustomAction Id="sqlcmd.cmd"
          Property="sqlcmd"
          Value="&quot;sqlcmd.exe&quot; -S [DATABASE_SERVER]
        -i &quot;[#CreateSchema.sql]&quot; -v var=SYSTEM_USER -o [INSTALLDIR]installSql.log" />


<CustomAction Id="sqlcmd"
          BinaryKey="WixCA"
          DllEntry="CAQuietExec"
          Return="check"
          Execute="deferred"
          Impersonate="yes" />

<InstallExecuteSequence> 
  <Custom Action="sqlcmd.cmd" After="InstallFiles">NOT Installed</Custom>
  <Custom Action="sqlcmd" After="sqlcmd.cmd">NOT Installed</Custom>
</InstallExecuteSequence>

日志文件显示-i参数没有任何文件名值:

MSI(4C):[09:58:15:610]:执行op:CustomActionSchedule(Action = sqlcmd,ActionType = 1025,Source = BinaryData,Target = CAQuietExec,CustomActionData =“sqlcmd.exe”-S( local)-i“” - v var = SYSTEM_USER -o C: installSql.log)

答案

这不是<Binary>的工作方式。 [#FileID]语法用于动态使用组件文件的运行时安装完整路径。

二进制文件通常用作自定义操作的临时提取文件,在这种情况下,还包括sql文件等。

考虑在wix中查看SQL扩展。作为一个最小的例子,看看这段代码。

添加sql命名空间xmlns:sql="http://schemas.microsoft.com/wix/SqlExtension"

<Binary Id="CreateSchema" SourceFile="..SQLCreateSchema.sql" />
<sql:SqlDatabase Id="MyDB" Database="[DATABASE]" Server="[DATABASE_SERVER]" />

在一个组件中,您可以添加

<sql:SqlScript  Id="CreateSchemaScript" BinaryKey="CreateSchema" ExecuteOnInstall="yes" Sequence="1" SqlDb="MyDB"/>

Here是SQL Schema定义的链接,包含所有可用元素。我没有对SQL扩展做太多工作,所以你可能需要做一些阅读以更好地了解在安装时完成创建数据库需要做些什么。

另一答案

正如我所提到的,我想同时使用SQLCMD - 因为我的SQL脚本是SSDT格式,而二进制文件(所以文件将在安装结束时删除)。

在寻找答案之后,我明白我不能使用WiX [#filekey],因为只要没有正在运行的自定义操作,就不会提取二进制文件 - 明确地使用它。所以最后我明白最好的方法是自己提取二进制文件。我在一个自定义操作中使用的步骤是:

  1. 从MSI二进制表中提取二进制SQL脚本。
  2. 在本地保存此文件
  3. 使用-i和新文件路径运行SQLCMD(我保存到的路径)
  4. 删除SQL文件

我遇到一些值得提及的问题,如果将文件保存到INSTALLDIR,而不是在自定义操作的tun时间目录可能不存在,那么请考虑将其保存到临时文件夹或预先创建目录。

以上是关于从WiX使用SQLCMD执行二进制SQL文件的主要内容,如果未能解决你的问题,请参考以下文章

执行 SQL 查询时出现 Wix 错误 -2147217900

使用 SQLCMD 执行 MS SQL Server (*.sql) 脚本备份还原操作有啥问题?

如何使用sqlcmd在批处理脚本中执行SQL?

SqlServer2008R2使用SQLCMD执行多个脚本

通过 SQLCMD 将 sql 文件从 MySQL 导入 MS SQL 时语法不正确

使用 SQLCMD 执行发布脚本不返回