WiX:从.bak文件恢复数据库并添加用户

时间:2017-11-22 17:36:45

标签: wix windows-installer

我需要能够使用WiX安装程序在安装过程中恢复数据库并更改该数据库。以下代码将恢复数据库,这很好用:

<sql:SqlDatabase Id="master_db" Server="[MSSQLSERVER]" Database="master" ConfirmOverwrite="yes" ContinueOnError="no" DropOnReinstall="no" DropOnInstall="no" DropOnUninstall="no" CreateOnInstall="no" CreateOnReinstall="no" CreateOnUninstall="no">
  <!-- restore blankaaa database -->
  <!-- RESTORE DATABASE blankaaa FROM DISK = '[INSTALLFOLDER]javaaaanew\blankaaa.bak' WITH RECOVERY -->
  <sql:SqlString Id="attach_db" ExecuteOnInstall="yes" ExecuteOnReinstall="no" ExecuteOnUninstall="no" ContinueOnError="no" Sequence="1" SQL="RESTORE DATABASE blankaaa FROM DISK = '[INSTALLFOLDER]javaaaanew\blankaaa.bak' WITH RECOVERY" />
  <!-- should fail here if preexisting database? -->
  <!-- rename blankaaa to aaanew3 -->
  <sql:SqlString Id="alter_db_name" ExecuteOnInstall="yes" ExecuteOnReinstall="no" ExecuteOnUninstall="no" ContinueOnError="no" Sequence="2" SQL="ALTER DATABASE blankaaa Modify Name = aaanew3" />
</sql:SqlDatabase>

但是,当我尝试连接到创建的新数据库时,我在MSI日志中收到一条错误,即Windows Installer无法使用以下代码连接到数据库:

<sql:SqlDatabase Id="aaanew3_db" Server="[MSSQLSERVER]" Database="aaanew3" ConfirmOverwrite="yes" ContinueOnError="no" DropOnReinstall="no" DropOnInstall="no" DropOnUninstall="no" CreateOnInstall="no" CreateOnReinstall="no" CreateOnUninstall="no">
  <!-- add user 'sa' to database -->
  <sql:SqlString Id="alter_db_sa" ExecuteOnInstall="yes" ExecuteOnReinstall="no" ExecuteOnUninstall="no" ContinueOnError="no" Sequence="3" SQL="CREATE USER [SQLUSERNAME] WITH PASSWORD = '[SQLPASSWORD]';" />
  <!-- change aaanew3 dbowner to 'sa' -->
  <sql:SqlString Id="alter_db_owner" ExecuteOnInstall="yes" ExecuteOnReinstall="no" ExecuteOnUninstall="no" ContinueOnError="no" Sequence="4" SQL="ALTER AUTHORIZATION ON DATABASE::aaanew3 TO [SQLUSERNAME];" />
  <!-- add user mapping for 'sa' on aaanew3 with schema 'dbo' -->
  <sql:SqlString Id="alter_db_schema" ExecuteOnInstall="yes" ExecuteOnReinstall="no" ExecuteOnUninstall="no" ContinueOnError="no" Sequence="5" SQL="ALTER USER [SQLUSERNAME] WITH DEFAULT_SCHEMA=dbo;" />
</sql:SqlDatabase>

我尝试使用sequence属性强制执行SQL事务序列,但似乎并不重要。以下是日志中产生的错误:

MSI (s) (D0:88) [11:33:50:188]: Invoking remote custom action. DLL: C:\Windows\Installer\MSI699A.tmp, Entrypoint: ExecuteSqlStrings
ExecuteSqlStrings:  Error 0x80004005: failed to connect to database: 'aaanew3'

DEBUG: Error 2814:  On the dialog AOSErrorDialog the control ErrorText names a non-existent control A as the next control
MSI (c) (DC:B0) [11:33:51:657]: Font created.  Charset: Req=0, Ret=0, Font: Req=MS Shell Dlg, Ret=MS Shell Dlg

The installer has encountered an unexpected error installing this package. This may indicate a problem with this package. The error code is 2814. The arguments are: AOSErrorDialog, ErrorText, A
MSI (c) (DC:B0) [11:33:56:454]: Product: Auction OS -- The installer has encountered an unexpected error installing this package. This may indicate a problem with this package. The error code is 2814. The arguments are: AOSErrorDialog, ErrorText, A

Error 26203. Failed to connect to SQL database.  (-2147467259   aaanew3      )
MSI (s) (D0!74) [11:33:56:470]: Product: Auction OS -- Error 26203. Failed to connect to SQL database.  (-2147467259   aaanew3      )

CustomAction ExecuteSqlStrings returned actual error code 1603 (note this may not be 100% accurate if translation happened inside sandbox)
Action ended 11:33:56: InstallFinalize. Return value 3.

0 个答案:

没有答案