2

我正在尝试解决在制作安装包时出现的问题。安装包是在visual studio 2010的帮助下用wix编写的。安装包正在创建一个数据库并向该数据库添加一些表。当用户执行安装包并连接到要创建数据库的远程服务器时,就会出现问题。两个参与的主机不在同一个域中,所以必须使用 sql-server 身份验证。在安装包中,我让用户能够在 Windows 和 SQL Server 身份验证之间进行选择。目前,用户会看到一个对话框,他可以在其中选择两个选项之一。任一选项的结果是,在存储连接字符串的文件中,配置值,即Integrated Securitytrue开关在和之间切换false。问题是,在安装过程中,用户的凭据用于登录远程 sql 服务器。我必须更改安装程序以便使用 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-Authentication。理想情况下,我想要这样的东西:

<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 元素作为子元素,因此必须以其他方式执行此操作。但我不知道怎么做。你能告诉我吗?

4

1 回答 1

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>

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

然后,您可以调用自定义操作,根据 的值设置组件的操作状态SQLSERVER_AUTHENTICATION。你可以通过调用来做到这一点MsiSetComponentState。如果您使用 DTF 的托管自定义操作,可以通过设置session.Components["ComponentName"].RequestState.

作为旁注,您可以SQLSERVER_AUTHENTICATION在重新安装时使用组件的当前安装状态?ComponentName之一进行预设,并使用语法完成。如果值为 2,则该组件不存在,如果值为 3,则安装该组件。

更新

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

我只想指出,文档似乎说您不能对不存在的数据库运行 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.

于 2013-08-15T18:32:41.193 回答