在远程数据库上执行SqlScript的WiX问题

时间:2010-07-15 13:27:56

标签: sql-server wix

在远程数据库上执行SqlScript会导致错误:

无法连接到SQL数据库。 (-2147467259 myDB1)

SqlScript如下:

<sql:SqlString 
Id='UpdateSomething1' 
SqlDb='myDB1' 
ExecuteOnInstall='yes' 
User='SQLUser'
ContinueOnError='no' 
ExecuteOnReinstall='no' 
ExecuteOnUninstall='no' 
Sequence='26'
SQL='[SqlString]'/>

其中Db是:

<sql:SqlDatabase 
Id='myDB1' 
Database='myDB1' 
Server='[DATABASE_SERVER]' 
CreateOnInstall='yes' 
DropOnInstall='no' 
DropOnUninstall='no' 
ContinueOnError='no'/>

用户是:

<util:User 
Id="SQLUser" 
Name="myUserName1" 
Password="password1"/>

本地数据库不会出现此问题。 我们从IP流量中提取了更具体的错误消息(远程MSSQL服务器抛出的实际错误):

  

无法打开数据库“myDb1”   登录请求。登录   失败。 {远程机器名}登录   用户{用户名}

失败

感谢您提供任何帮助和信息。

最高

3 个答案:

答案 0 :(得分:0)

我需要更多信息,但这是我多年来的一些一般性观察。

在MSI中,您通常运行延迟的自定义操作而不进行模拟,以便它们以管理员身份运行以支持托管/提升安装,其中调用用户没有管理员,因为他们实际上没有或因为UAC没有提升他们的过程。

在InstallShield中,我确信WiX类似,这通常会导致远程数据库连接出现问题。如果在UI序列中有一个对话框来测试连接,它将成功(当需要时),因为交互式用户具有该数据库/实例的权限。如果在本地安装它将成功,因为SYSTEM(通常)拥有数据库/实例的权限。但是,当安装到远程实例时,它经常会失败,因为SYSTEM无法对远程计算机上的SQL进行身份验证。如果使用sql身份验证(例如SA),您的里程将会提高。

就个人而言,我有一些我遵循的做法。如果我正在创建单层系统,我将数据库限制为(本地)。如果我正在创建一个2层系统,我创建了两个安装程序:一个用于我的数据库层,我限制为(本地),另一个用于我的应用程序层,然后我重复使用sqllogin对话框来验证连接并将值写入a web.config或app.config。这使我能够松散地耦合各层并相互独立地为它们提供服务。

我希望这有助于理解可能遇到的问题类型。如果没有看到你的环境,我不知道你的确切问题。

答案 1 :(得分:0)

WiX自定义操作仅使用标准OLEDB命令连接到远程服务器。如果凭证在本地但不是远程工作,那么我首先要确保凭证是正确的。本地和远程服务器之间的WiX自定义操作没有任何不同。

答案 2 :(得分:0)

查看您的数据库元素我会说您没有将User属性添加到sql:SqlDatabase,因此它正在创建模拟当前用户的数据库。

尝试:

<sql:SqlDatabase 
    Id='myDB1' 
    Database='myDB1' 
    Server='[DATABASE_SERVER]' 
    User='SQLUser'
    CreateOnInstall='yes' 
    DropOnInstall='no' 
    DropOnUninstall='no' 
    ContinueOnError='no' />