我不希望在发生自动卸载时执行SQL脚本,因为主要升级会删除现有产品。
问题是我将数据库用户名和密码作为命令行参数传递,因此当它进行升级并自动运行卸载时,它会尝试执行SQL脚本,但是没有数据库用户名或密码,所以升级失败了。您可以在SQL事件探查器中看到用户名设置为'' (空白)。
我的组件代码如下:
<Component Id="SQL" Guid="AF267662-23A0-4b46-B490-C11465BE9858" KeyPath="yes" >
<Condition>NOT UPGRADINGPRODUCTCODE AND NOT REMOVE="ALL"</Condition>
<!--UNINSTALL-->
<sql:SqlScript Id="Uninstall.SQLScript" ExecuteOnInstall="no" ExecuteOnUninstall="yes" BinaryKey="SQLScript.Uninstall" User="SQLUser" SqlDb="SqlDatabase" Sequence="1"/>
<!--INSTALL-->
<sql:SqlScript Id="SQLScript2" ExecuteOnInstall="yes" ExecuteOnUninstall="no" BinaryKey="SQLScript.Create.DBObjects" User="SQLUser" SqlDb="SqlDatabase" Sequence="3"/>
</Component>
答案 0 :(得分:1)
条件应该是自定义操作,而不是组件。 这有一个很好的例子:
Wix: Run custom action based on condition
同样在这里: How can I perform a custom action in WiX that only executes on install or uninstall?
当您在某个组件上放置条件时,它会使其传递,这意味着组件的安装状态将根据属性的值在安装和修复期间发生变化。这不是你真正需要的,这就是为什么你应该调整CA而不是组件。