如果实例存在,如何使WIX安装程序无法创建数据库

时间:2016-03-09 23:12:07

标签: sql-server 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="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=&quot;SQL_Latin1_General_CP1_CI_AS&quot; /SECURITYMODE=SQL /SAPWD=&quot;password&quot; /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时如何修改变量。

1 个答案:

答案 0 :(得分:0)

进行自定义操作以检查是否存在。如果您不想执行自定义操作或将结果设置为wix值,则可以return;

session["SQLINSTANCE"] = yourResult;

在你的wxs中

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