如何在Wix Major升级期间防止数据库丢失

时间:2016-01-12 12:34:45

标签: wix installer

我正在使用Wix 3.10构建一个安装程序,它将安装文件,创建服务以及创建和填充数据库。

我正在使用Wix sql:SqlDatabase元素创建数据库并运行一些sql脚本以在安装期间填充它(主要基于WIX database deployment, installation

根据Wix文档中的建议,我在发布初始安装程序之前测试模拟升级。我强烈建议坚持主要升级,因此我按照示例使用MajorUpgrade元素。

不幸的是,在主要升级期间,我似乎无法阻止Wix卸载数据库,也无法找到有关如何处理此问题的任何指导。据我所知,主要升级实际上是卸载当前版本,然后重新安装新版本,但肯定有一种方法可以保留部分原始版本?

我也遇到了与我安装的服务类似的问题,但基于这个问题Wix Major Upgrade: how do I prevent Windows service reinstallation?,解决方案似乎是在安装序列的删除服务条目中添加条件:

<InstallExecuteSequence>
    <DeleteServices>NOT UPGRADINGPRODUCTCODE</DeleteServices>
</InstallExecuteSequence>

这个暗示我可以在主要升级中保留条目,但我可能会误解。

不幸的是,SqlDatabase实体似乎没有任何等效的installexecute序列元素。关于如何应对此问题,是否有任何指导?

更新

根据PhilDW的回答,更改主要升级的顺序或时间表是通过更改Schedule attribue来完成的:

<MajorUpgrade 
  DowngradeErrorMessage="A newer version of [ProductName] is already installed."
  Schedule="afterInstallExecute"/>

注意然而,这只会带您到目前为止 - 如果您计划在安装程序中添加对受信任身份验证和SQL身份验证的支持(根据上面的SO文章)它将无法正常工作,我的假设是Wix确定从未安装过一个组件(未选择任何认证选项),因此将始终删除数据库。

1 个答案:

答案 0 :(得分:1)

根据MSI的内部结构,有几种方法可以解决这个问题:

  1. 在InstallExecute之后和InstallFinalize之前,在&#34; end&#34;上排序的主要升级意味着升级基本上是在当前安装的产品之上安装新产品。文件覆盖规则适用,其中之一是如果数据文件在安装后已更新,则不会被替换。因此保存了数据文件。其他注意事项是必须为需要更新的人更新二进制文件版本,并且必须遵循组件规则。

  2. 如果问题基于卸载旧产品时运行的自定义操作,则可以使用自定义操作条件,例如REMOVE =&#34; ALL&#34;而不是UPGRADINGPRODUCTCODE。 UPGRADINGPRODUCTCODE在旧产品中设置,因为它正在卸载,而不是在传入升级中。

  3. 我相信一些WiX工具类型的自定义操作是基于相关组件的卸载,所以你不需要在2.在InstallExecute之后的一次重大升级会增加每个组件的引用计数(这是你需要遵循组件规则的原因,同时遵循文件覆盖规则。因此,您的数据文件的引用计数最多为2,不会被覆盖,然后较旧的产品卸载会将其减少为1,以便组件保持不变,并且基于组件删除的卸载自定义操作将无法运行。

  4. 如果在基于自定义操作的升级安装中需要执行某些操作,则WIX_UPGRADE_DETECTED将告诉您正在升级已安装的产品。

  5. 在你提到的升级链接上,Chris Painter的回答是正确的。这与我在这里做的基本相同,所以他当然是对的:)