如何有条件地使用两个不同的SqlDatabase元素?

时间:2013-08-15 17:32:27

标签: sql authentication wix

我正在尝试解决制作安装包时出现的问题。安装包在Visual Studio 2010的帮助下用wix编写。安装包正在创建一个数据库并向该数据库添加一些表。当用户执行安装包并连接到将在其中创建数据库的远程服务器时,会出现问题。两个参与的主机不在同一个域中,因此必须使用sql-server身份验证。在安装包中,我为用户提供了在Windows和SQL-Server身份验证之间进行选择的功能。此时,向用户呈现一个对话框,在该对话框中,他可以选择两个选项中的一个。任一选项的结果是,在存储连接字符串的文件中,配置值,即Integrated Security开关在truefalse之间切换。问题是,在安装过程中,用户的凭据用于登录远程sql server。我必须更改安装程序,以便使用sql凭据。我知道我可以通过使用以下sql元素来实现这一点:

<sql:SqlDatabase Id="MasterDB" Server="[SQLSERVER_SERVER]" Instance="[SQLSERVER_INSTANCENAME]" Database="master" User="SqlUser" />

为User属性分配了WixUtilExtension提供的用户元素的id:

 <util:User Id="SqlUser" Name="[SQLSERVER_USERNAME]" Password="[SQLSERVER_PASSWORD]" />

我不知道的是如何创建两个不同的SqlDatabase元素,一个用于Windows,另一个用于具有相同名称的SQL身份验证。理想情况下,我想要这样的东西:

<sql:SqlDatabase Id="MasterDB" Server="[SQLSERVER_SERVER]" Instance="[SQLSERVER_INSTANCENAME]" Database="master" User="SqlUser"><Condition>SQLSERVER_AUTHENTICATION=1</Condition></sql:SqlDatabase>
<sql:SqlDatabase Id="MasterDB" Server="[SQLSERVER_SERVER]" Instance="[SQLSERVER_INSTANCENAME]" Database="master"><Condition>SQLSERVER_AUTHENTICATION=0</Condition></sql:SqlDatabase>

SqlDatabase元素不允许将Condition元素作为子元素,因此必须以其他方式完成。但我不知道怎么做。你能告诉我吗?

1 个答案:

答案 0 :(得分:1)

您可以创建两个数据库(在他们自己的组件中),并根据用户的选择使用自定义操作更改所述组件的操作状态。

<Component Id="SqlAuthDB" Guid="PUT-GUID-HERE">
    <sql:SqlDatabase Id="SqlAuthDB" Server="[SQLSERVER_SERVER]" 
        Instance="[SQLSERVER_INSTANCENAME]" Database="master" User="SqlUser" />
    <util:User Id="SqlUser" Name="[SQLSERVER_USERNAME]" 
        Password="[SQLSERVER_PASSWORD]" />
</Component>

<Component Id="WinAuthDB" Guid="PUT-GUID-HERE">
    <sql:SqlDatabase Id="WinAuthDB" Server="[SQLSERVER_SERVER]" 
        Instance="[SQLSERVER_INSTANCENAME]" Database="master" />
</Component>

这很可能会影响文件成本核算,而我唯一可以看到的解决方法是从一开始就使用始终评估为false的条件禁用其中一个,例如<Condition>1=0</Condition>

然后,您可以调用自定义操作,根据SQLSERVER_AUTHENTICATION的值设置组件的操作状态。您可以致电MsiSetComponentState来完成此操作。如果您使用的是DTF的托管自定义操作,则可以通过设置session.Components["ComponentName"].RequestState

来完成

作为旁注,您可以在使用SQLSERVER_AUTHENTICATION语法完成组件的current install state之一时重新安装?ComponentName。如果值为2,则组件不存在,如果为3,则组件已安装。

<强>更新

如果用户选择了Windows身份验证,我建议删除User表中的SqlDatabase属性。 sql扩展的自定义操作在任何UI(甚至查找数据库)之后运行,因此您可以使用Publish元素运行自定义操作。

我只想指出documentation似乎表示您无法对非现有数据库运行sql语句:

This allows MSI to install SqlScripts or SqlStrings to already existing databases on the machine. The install will fail if the database does not exist in these cases.