我有一个WIX安装程序,其服务器安装包含自定义代码和SQL Server。该项目由自定义代码安装程序和包含SQL Server自定义代码的软件包组成。
在捆绑包中,它会检查是否存在实例名称,如果存在,则不会安装SQL Server。
<!-- Microsoft SQL Server 2012 Express -->
<Fragment>
<?define SQLServer2012Link = http://download.microsoft.com/download/0/1/E/01E0D693-2B4F-4442-9713-27A796B327BD/SQLEXPR_x86_ENU.exe ?>
<?define InstanceName = "testinstance" ?>
<util:RegistrySearch Id="SqlInstanceFound" Variable="SqlInstanceFound64" Result="exists" Root="HKLM" Key="SOFTWARE\Microsoft\Microsoft SQL Server\$(var.InstanceName)" Win64="yes" />
<util:RegistrySearch Id="SqlInstanceKeyFound" Variable="SqlInstanceFound32" Result="exists" Root="HKLM" Key="SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL" Value="$(var.InstanceName)" Win64="no" />
<PackageGroup Id="PackageGroup_SQLServer2012">
<!-- Microsoft SQL Server 2012 Express for new instalation-->
<ExePackage
Id="Package_SQLServer2012" DisplayName="Microsoft SQL Server 2012 Express SP2"
InstallCondition="NOT Installed AND InstallServer = 1" DetectCondition="SqlInstanceFound64 OR SqlInstanceFound32"
Name="Prerequisites\SQLEXPR_x86_ENU.exe"
DownloadUrl="$(var.SQLServer2012Link)"
Permanent="yes" PerMachine="yes" Vital="yes" Compressed="no"
InstallCommand="/QS /HIDECONSOLE /ACTION=Install /FEATURES=SQL /INSTANCENAME=$(var.InstanceName) /SQLCOLLATION="SQL_Latin1_General_CP1_CI_AS" /SECURITYMODE=SQL /SAPWD="password" /TCPENABLED=1 /NPENABLED=1 /SQLSYSADMINACCOUNTS=BUILTIN\Administrators /ADDCURRENTUSERASSQLADMIN=TRUE /SKIPRULES=RebootRequiredCheck /IAcceptSQLServerLicenseTerms">
<RemotePayload
CertificatePublicKey="B78FE7F6917E1BC5F4A9C77BA3D555A0E807B9E0"
CertificateThumbprint="67B1757863E3EFF760EA9EBB02849AF07D3A8080"
Hash="94EAAFA2A4C976B107ED23502B9DE9FA0F87D2E5"
Description="Microsoft SQL Server 2012 Express SP2"
ProductName="Microsoft SQL Server 2012 Express SP2" Size="274628920" Version="11.0.5058.0" />
<ExitCode Value ="3010" Behavior="success" />
</ExePackage>
</PackageGroup>
</Fragment>
在自定义代码安装中,它运行一些sql脚本来创建和填充数据库。
<Component Id='SqlComponent' Guid='A60B1852-7C4B-402B-A619-EECA2893C5AC' KeyPath='yes'>
<sql:SqlDatabase Id='SqlDatabase' Database='db' Server='(local)' Instance='testinstance' User='SQLUser' CreateOnInstall='yes' DropOnUninstall='no' ContinueOnError='no'/>
<sql:SqlScript Id="CreateUsers" ExecuteOnInstall="yes" BinaryKey="CreateUsersSql" SqlDb="SqlDatabase" User="SQLUser"/>
<sql:SqlScript Id="CreateBaseLineDb" ExecuteOnInstall="yes" BinaryKey="CreateBaseLineDbSql" SqlDb="SqlDatabase" User="SQLUser"/>
<sql:SqlScript Id="UpgradeDb" ExecuteOnInstall="yes" BinaryKey="UpgradeDbSql" SqlDb="SqlDatabase" User="SQLUser"/>
<!-- sql:SqlScript Id="UpdateCustomPlayList" ExecuteOnInstall="yes" BinaryKey="UpdateCustomPlayListSql" SqlDb="SqlDatabase" User="SQLUser"/ -->
<sql:SqlScript Id="RemoveOldContent" ExecuteOnInstall="yes" BinaryKey="RemoveOldGuruContentSql" SqlDb="SqlDatabase" User="SQLUser"/>
<sql:SqlScript Id="AddCompleteMedia" ExecuteOnInstall="yes" BinaryKey="AddCompleteMediaSql" SqlDb="SqlDatabase" User="SQLUser"/>
<sql:SqlScript Id="InstallContent" ExecuteOnInstall="yes" BinaryKey="InstallGuruContentSql" SqlDb="SqlDatabase" User="SQLUser"/>
<sql:SqlScript Id="InstallFeaturedContent" ExecuteOnInstall="yes" BinaryKey="InstallFeaturedContentSql" SqlDb="SqlDatabase" User="SQLUser"/>
</Component>
问题是,即使实例存在,自定义代码安装仍会尝试创建已存在的数据库。
如果实例已存在,如何防止sql脚本运行?
谢谢, 加里
更新:我添加/修改了以下代码......
到捆绑......
<Variable Name="SQLInstalled" Type="numeric" bal:Overridable="yes" Value="0" Persisted="yes"/>
<MsiPackage Id="GuruServer" Cache="no" Compressed="$(var.Compressed)" InstallCondition="InstallServer = 1"
Description="Guru Server" DownloadUrl="$(var.GuruDownloadRepo)/{2}"
SourceFile="$(var.GuruServerInstall.TargetPath)"
Name="GuruTeach\$(var.GuruServerInstall.TargetFileName)">
<MsiProperty Name="CHGFIREWALL" Value="[AddFirewallExceptions]"/>
<MsiProperty Name="SQLINSTALLED" Value="[SQLInstalled]"/>
</MsiPackage>
在产品中,我将以下条件添加到组件中......
<Condition><![CDATA[SQLINSTALLED = 1]]></Condition>
我还不知道在安装SQL Server时如何修改变量。
答案 0 :(得分:0)
进行自定义操作以检查是否存在。如果您不想执行自定义操作或将结果设置为wix值,则可以return;
session["SQLINSTANCE"] = yourResult;
在你的wxs中
<Custom Action="DoSometh" After='InstallFinalize'>NOT Install AND (<![CDATA[SQLINSTANCE<>"true"]]>)</Custom>