如何防止 WIX 安装程序创建数据库(如果存在实例)



我有一个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="SOFTWAREMicrosoftMicrosoft SQL Server$(var.InstanceName)" Win64="yes" />
    <util:RegistrySearch Id="SqlInstanceKeyFound" Variable="SqlInstanceFound32" Result="exists" Root="HKLM" Key="SOFTWAREMicrosoftMicrosoft SQL ServerInstance NamesSQL" 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="PrerequisitesSQLEXPR_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=&quot;SQL_Latin1_General_CP1_CI_AS&quot; /SECURITYMODE=SQL /SAPWD=&quot;password&quot; /TCPENABLED=1 /NPENABLED=1 /SQLSYSADMINACCOUNTS=BUILTINAdministrators /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 时如何修改变量。

创建一个自定义操作来检查静止。您可以return;是否不想执行自定义操作或将结果设置为 wix 值

session["SQLINSTANCE"] = yourResult;

在你的wxs中

  <Custom Action="DoSometh" After='InstallFinalize'>NOT Install AND  (<![CDATA[SQLINSTANCE<>"true"]]>)</Custom>

最新更新