我有一个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时如何修改这个变量。
发布于 2016-03-14 17:11:09
如果您不想执行自定义操作或将结果设置为Wix值,则创建一个自定义操作来检查实例.You是否可以return;
session["SQLINSTANCE"] = yourResult;在你的wxs中
<Custom Action="DoSometh" After='InstallFinalize'>NOT Install AND (<![CDATA[SQLINSTANCE<>"true"]]>)</Custom>https://stackoverflow.com/questions/35904539
复制相似问题