在远程数据库上执行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” 登录请求。登录 失败。 {远程机器名}登录 用户{用户名}
失败
感谢您提供任何帮助和信息。
最高
答案 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' />