问题
Good morning, all. This is my first question on stackoverflow, so hopefully this isn't something that's been beaten to death and I haven't been able to find it.
I'm developing an application that is going to be distributed shrinkwrapped. We have gotten the rights to distribute SQL Server 2008 Express Edition with our application, but exactly HOW to do this is a little more difficult. Right now we're using a standard Visual Studio setup project, and I was obviously hoping for something very easy, like a configurable merge module, but obviously no such thing exists or I wouldn't be posting here ;)
The road I had started going down was to include the self-extracting EXE with our package, then use a custom install action to extract it and pass command line arguments to the SQL installer to create our named instance. Here's where the problem comes in.
Extraction is fine. I can run the script from Windows and it installs SQL Server just as it should, but I can't run the SQL installer from my custom action because it's saying that there is already another installation in progress. This other installation is, of course, my application, and it isn't going to end until SQL Server finishes, so we're essentially at a deadlock until SQL finally gives up and errors out.
What I WANT is a named instance of SQL server for my application that is installed with it and gets uninstalled with it. Writing my own installer is not an option because of time, and my coworker says InstallShield is not an option because of complexity (I've never used it, so I'll take his word for it). Does anyone have any thoughts?
回答1:
We encountered a similar issue to this when we tried to deploy a named instance of SQL 2008 Express R2 with our shrink wrapped app. We did get it working by making a custom bootstrapper. Below are copies of the entries from our wiki that describe this, hopefully they will be of use to others trying to do this.
One important point to note is that in VS2012/2013 we are yet to work out how to make this work with InstallShield LE (ISLE), so if you are adopting this solution now and planning to upgrade VS then this is probably not worth doing, better to find a solution that will work in ISLE too.
SQL 2008 R2 Prerequisite Bootstrapper for use in Setup Projects
Out of the box in VS2010, It is not possible to set SQL2008 Express R2 as a prerequisite for a Setup project. The reason this is not possible is that there is no 'bootstrapper' for R2, only for 2008 Express. Additionally, MS do not plan to add a bootstrapper for R2 as VS simply gets bootstrappers for whatever versions of SQL existed when that version of VS was released (R2 was released after VS2010).
As there is no MS bootstrapper for SQL 2008 R2, you need to create your own as per this article:
http://robindotnet.wordpress.com/2011/02/06/how-about-a-bootstrapper-package-for-sqlserver-express-2008-r2/
This bootstrapper either creates the SQLEXPRESS instance if no older instance with that name exists, or updates an earlier instance with the name SQLEXPRESS to SQL Express 2008 R2.
NB: Changing the name of the SQL instance CANNOT be done with this as it stands, as the sqlversionchk.exe program used by the xml file is programmed to check only the instance called SQLEXPRESS and there is no way to pass it an alternate name. We have solved this issue by creating a new variant of the above files that do not use the sqlversionchk exe, but instead use a reg check to determine if SQL is installed and if so what version:
SQL 2008 R2 Named Instance Bootstrapping
Goal: Use proper VS Setup project boot strapper (i.e. tick that 2008 R2 is a pre-requisite in the setup project pre-reqs) and then have the setup project install or upgrade a custom named instance of SQL Server.
Success: We have created a custom bootstrapper for our app's version of SQL , it does away with the SQLVersionCh.exe program altogether.
What we did:
We started with robindotnet's custom R2 bootstrapper as detailed above.
We then removed all of the references to sqlversionchk.exe and replaced them with registry checks for the what the current version of sql is. This is not as thorough as sqlversionchk, as that will also check things like whether the SQL instance is in the right language and a lot of conditions about if x version of sql is currently installed then it cannot be updated. however, for our purposes this doesn't matter, as we are in control of the instance (as it is a custom instance not the default SQLEXPRESS instance) so we will know what versions it can possibly be and so we can check for these versions.
The bootstrapper then works by simply checking the following four scenarios, of which only one should ever be true (i.e. the four scenarios should be mutually exclusive)
Scenario 1:
Platform: x86
Registry check: No registry value for our instance name
Action: Nothing in the registry, therefore SQL not installed, if this is an x86 machine install SQL
Scenario 2:
Platform: x86
Registry Check: registry value not equal to the most current SQL version we are using
Action: Upgrade our existing custom named instance to the version of SQL we are currently using.
This logic is theoretically wrong if the installed version of SQL was a later version than the one we are trying to install (as we would be upgrading to an earlier version, which would fail), but this should never happen unless the user decides to manually upgrade our instance of SQL, which is beyond our ability to control.
Scenario 3:
Platform: amd64 (note this does not mean this is an amd machine, just that it is a 64bit Windows installation)
Registry Check: No registry value for our instance name
Action: Nothing in the registry, therefore SQL not installed, if this is an 64 bit machine install SQL
Scenario 4:
Platform: amd64
Registry Check: registry value not equal to the most current SQL version we are using Action: Upgrade our existing custom named instance to the version of SQL we are currently using.
The full bootstrapper file is detailed at the end of this post.
How this custom bootstrapper will change in the future
We can check for whatever version numbers we like in the registry and determine what version is installed. We can then steer the execution as appropriate. For example if you need to have upgraded to 2008 R2 before you can then update to 2010, we can do that using the bypassIf construct and simply introducing more variations into the table above.
Our version of the bootstrapper:
Note that the custom instance name is 'MVXBM'
<?xml version="1.0" encoding="utf-8" ?>
<Package
xmlns="http://schemas.microsoft.com/developer/2004/01/bootstrapper"
Name="DisplayName"
Culture="Culture"
LicenseAgreement="eula.rtf">
<PackageFiles CopyAllPackageFiles="false">
<PackageFile Name="SQLEXPR32_x86_ENU.EXE" HomeSite="SqlExpr32Exe"/>
<PackageFile Name="SQLEXPR_x64_ENU.EXE" HomeSite="SqlExpr64Exe"/>
<PackageFile Name="eula.rtf"/>
</PackageFiles>
<InstallChecks>
<RegistryCheck Property="SQLVersion" Key="HKLM\SOFTWARE\Microsoft\Microsoft SQL Server\MVXBM\MSSQLServer\CurrentVersion" Value="CurrentVersion" />
</InstallChecks>
<Commands Reboot="Defer">
<!-- Defines a new installation (x86) -->
<Command PackageFile="SQLEXPR32_x86_ENU.EXE"
Arguments='/q /hideconsole /action=Install /features=SQL /instancename=MVXBM /enableranu=1 /sqlsvcaccount="NT Authority\Network Service" /AddCurrentUserAsSqlAdmin /skiprules=RebootRequiredCheck /IAcceptSQLServerLicenseTerms'
EstimatedInstalledBytes="225000000"
EstimatedInstallSeconds="420">
<InstallConditions>
<FailIf Property="VersionNT" Compare="ValueNotExists" String="GeneralFailure"/>
<FailIf Property="VersionNT" Compare="VersionLessThan" Value="5.1.2" String="InvalidPlatformXP"/>
<FailIf Property="VersionNT" Compare="VersionEqualTo" Value="5.2.0" String="InvalidPlatform2K3"/>
<FailIf Property="VersionNT" Compare="VersionEqualTo" Value="5.2.1" String="InvalidPlatform2K3"/>
<FailIf Property="AdminUser" Compare="ValueEqualTo" Value="false" String="AdminRequired"/>
<BypassIf Property="ProcessorArchitecture" Compare="ValueNotEqualTo" Value="Intel"/>
<BypassIf Property="SQLVersion" Compare="ValueExists"/>
</InstallConditions>
<ExitCodes>
<ExitCode Value="0" Result="Success"/>
<ExitCode Value="1641" Result="SuccessReboot"/>
<ExitCode Value="3010" Result="SuccessReboot"/>
<!-- 0x84BE0BC2 (1214,3010) -->
<ExitCode Value="-2067919934" Result="FailReboot"/>
<!-- 0x84C10BC2 (1217,3010) -->
<ExitCode Value="-2067723326" Result="FailReboot"/>
<!-- 0x84BE0007 (1214,7) -->
<ExitCode Value="-2067922937" Result="Fail" String="AdminRequired"/>
<!-- 0x84C4001F (1220,31) -->
<ExitCode Value="-2067529697" Result="Fail" String="AdminRequired"/>
<!-- 0x84BE0001 (1214,1)-->
<ExitCode Value="-2067922943" Result="Fail" String="InvalidPlatformOSServicePacks"/>
<!-- 0x84C4000B (1220,11) -->
<ExitCode Value="-2067529717" Result="Fail" String="AnotherInstanceRunning"/>
<!-- 0x84BE01F8 (1214,504) -->
<ExitCode Value="-2067922440" Result="Fail" String="BetaComponentsFailure"/>
<!-- 0x84BE01FA (1214,506) -->
<ExitCode Value="-2067922438" Result="Fail" String="BetaComponentsFailure"/>
<!-- 0x84BE0202 (1214,514) -->
<ExitCode Value="-2067922430" Result="Fail" String="InvalidPlatformArchitecture"/>
<!-- 0x84BE0203 (1214,515) -->
<ExitCode Value="-2067922429" Result="Fail" String="InvalidPlatformArchitecture"/>
<ExitCode Value="216" Result="Fail" String="InvalidPlatformArchitecture"/>
<DefaultExitCode Result="Fail" FormatMessageFromSystem="true" String="GeneralFailure" />
</ExitCodes>
</Command>
<!-- Defines an upgrade installation (x86) -->
<Command PackageFile="SQLEXPR32_x86_ENU.EXE"
Arguments="/q /hideconsole /action=Upgrade /instancename=MVXBM /skiprules=RebootRequiredCheck /IAcceptSQLServerLicenseTerms"
EstimatedInstalledBytes="225000000"
EstimatedInstallSeconds="420">
<InstallConditions>
<BypassIf Property="ProcessorArchitecture" Compare="ValueNotEqualTo" Value="Intel"/>
<BypassIf Property="SQLVersion" Compare="ValueNotExists"/>
<BypassIf Property="SQLVersion" Compare="ValueEqualTo" Value="10.50.1600.1"/>
</InstallConditions>
<ExitCodes>
<ExitCode Value="0" Result="Success"/>
<ExitCode Value="1641" Result="SuccessReboot"/>
<ExitCode Value="3010" Result="SuccessReboot"/>
<!-- 0x84BE0BC2 (1214,3010) -->
<ExitCode Value="-2067919934" Result="FailReboot"/>
<!-- 0x84C10BC2 (1217,3010) -->
<ExitCode Value="-2067723326" Result="FailReboot"/>
<!-- 0x84BE0007 (1214,7) -->
<ExitCode Value="-2067922937" Result="Fail" String="AdminRequired"/>
<!-- 0x84C4001F (1220,31) -->
<ExitCode Value="-2067529697" Result="Fail" String="AdminRequired"/>
<!-- 0x84BE0001 (1214,1)-->
<ExitCode Value="-2067922943" Result="Fail" String="InvalidPlatformOSServicePacks"/>
<!-- 0x84C4000B (1220,11) -->
<ExitCode Value="-2067529717" Result="Fail" String="AnotherInstanceRunning"/>
<!-- 0x84BE01F8 (1214,504) -->
<ExitCode Value="-2067922440" Result="Fail" String="BetaComponentsFailure"/>
<!-- 0x84BE01FA (1214,506) -->
<ExitCode Value="-2067922438" Result="Fail" String="BetaComponentsFailure"/>
<!-- 0x84BE0202 (1214,514) -->
<ExitCode Value="-2067922430" Result="Fail" String="InvalidPlatformArchitecture"/>
<!-- 0x84BE0203 (1214,515) -->
<ExitCode Value="-2067922429" Result="Fail" String="InvalidPlatformArchitecture"/>
<ExitCode Value="216" Result="Fail" String="InvalidPlatformArchitecture"/>
<DefaultExitCode Result="Fail" FormatMessageFromSystem="true" String="GeneralFailure" />
</ExitCodes>
</Command>
<!-- Defines a new installation (amd64) -->
<Command PackageFile="SQLEXPR_x64_ENU.EXE"
Arguments='/q /hideconsole /action=Install /features=SQL /instancename=MVXBM /enableranu=1 /sqlsvcaccount="NT Authority\Network Service" /AddCurrentUserAsSqlAdmin /skiprules=RebootRequiredCheck /IAcceptSQLServerLicenseTerms'
EstimatedInstalledBytes="225000000"
EstimatedInstallSeconds="420">
<InstallConditions>
<BypassIf Property="ProcessorArchitecture" Compare="ValueNotEqualTo" Value="amd64"/>
<BypassIf Property="SQLVersion" Compare="ValueExists"/>
</InstallConditions>
<ExitCodes>
<ExitCode Value="0" Result="Success"/>
<ExitCode Value="1641" Result="SuccessReboot"/>
<ExitCode Value="3010" Result="SuccessReboot"/>
<!-- 0x84BE0BC2 (1214,3010) -->
<ExitCode Value="-2067919934" Result="FailReboot"/>
<!-- 0x84C10BC2 (1217,3010) -->
<ExitCode Value="-2067723326" Result="FailReboot"/>
<!-- 0x84BE0007 (1214,7) -->
<ExitCode Value="-2067922937" Result="Fail" String="AdminRequired"/>
<!-- 0x84C4001F (1220,31) -->
<ExitCode Value="-2067529697" Result="Fail" String="AdminRequired"/>
<!-- 0x84BE0001 (1214,1)-->
<ExitCode Value="-2067922943" Result="Fail" String="InvalidPlatformOSServicePacks"/>
<!-- 0x84C4000B (1220,11) -->
<ExitCode Value="-2067529717" Result="Fail" String="AnotherInstanceRunning"/>
<!-- 0x84BE01F8 (1214,504) -->
<ExitCode Value="-2067922440" Result="Fail" String="BetaComponentsFailure"/>
<!-- 0x84BE01FA (1214,506) -->
<ExitCode Value="-2067922438" Result="Fail" String="BetaComponentsFailure"/>
<!-- 0x84BE0202 (1214,514) -->
<ExitCode Value="-2067922430" Result="Fail" String="InvalidPlatformArchitecture"/>
<!-- 0x84BE0203 (1214,515) -->
<ExitCode Value="-2067922429" Result="Fail" String="InvalidPlatformArchitecture"/>
<ExitCode Value="216" Result="Fail" String="InvalidPlatformArchitecture"/>
<DefaultExitCode Result="Fail" FormatMessageFromSystem="true" String="GeneralFailure" />
</ExitCodes>
</Command>
<!-- Defines an upgrade installation (amd64) -->
<Command PackageFile="SQLEXPR_x64_ENU.EXE"
Arguments="/q /hideconsole /action=Upgrade /instancename=MVXBM /skiprules=RebootRequiredCheck /IAcceptSQLServerLicenseTerms"
EstimatedInstalledBytes="225000000"
EstimatedInstallSeconds="420">
<InstallConditions>
<BypassIf Property="ProcessorArchitecture" Compare="ValueNotEqualTo" Value="amd64"/>
<BypassIf Property="SQLVersion" Compare="ValueNotExists"/>
<BypassIf Property="SQLVersion" Compare="ValueEqualTo" Value="10.50.1600.1"/>
</InstallConditions>
<ExitCodes>
<ExitCode Value="0" Result="Success"/>
<ExitCode Value="1641" Result="SuccessReboot"/>
<ExitCode Value="3010" Result="SuccessReboot"/>
<!-- 0x84BE0BC2 (1214,3010) -->
<ExitCode Value="-2067919934" Result="FailReboot"/>
<!-- 0x84C10BC2 (1217,3010) -->
<ExitCode Value="-2067723326" Result="FailReboot"/>
<!-- 0x84BE0007 (1214,7) -->
<ExitCode Value="-2067922937" Result="Fail" String="AdminRequired"/>
<!-- 0x84C4001F (1220,31) -->
<ExitCode Value="-2067529697" Result="Fail" String="AdminRequired"/>
<!-- 0x84BE0001 (1214,1)-->
<ExitCode Value="-2067922943" Result="Fail" String="InvalidPlatformOSServicePacks"/>
<!-- 0x84C4000B (1220,11) -->
<ExitCode Value="-2067529717" Result="Fail" String="AnotherInstanceRunning"/>
<!-- 0x84BE01F8 (1214,504) -->
<ExitCode Value="-2067922440" Result="Fail" String="BetaComponentsFailure"/>
<!-- 0x84BE01FA (1214,506) -->
<ExitCode Value="-2067922438" Result="Fail" String="BetaComponentsFailure"/>
<!-- 0x84BE0202 (1214,514) -->
<ExitCode Value="-2067922430" Result="Fail" String="InvalidPlatformArchitecture"/>
<!-- 0x84BE0203 (1214,515) -->
<ExitCode Value="-2067922429" Result="Fail" String="InvalidPlatformArchitecture"/>
<ExitCode Value="216" Result="Fail" String="InvalidPlatformArchitecture"/>
<DefaultExitCode Result="Fail" FormatMessageFromSystem="true" String="GeneralFailure" />
</ExitCodes>
</Command>
</Commands>
<Strings>
<String Name="DisplayName">SQL Server 2008 R2 Express - MVXBM</String>
<String Name="Culture">en</String>
<String Name="SqlExpr32Exe">http://download.microsoft.com/download/5/1/a/51a153f6-6b08-4f94-a7b2-ba1ad482bc75/SQLEXPR32_x86_ENU.exe</String>
<String Name="SqlExpr64Exe">http://download.microsoft.com/download/5/1/a/51a153f6-6b08-4f94-a7b2-ba1ad482bc75/SQLEXPR_x64_ENU.exe</String>
<String Name="AdminRequired">You do not have the permissions required to install SQL Server 2008 R2 Express. Please contact your administrator.</String>
<String Name="GeneralFailure">An error occurred attempting to install SQL Server 2008 R2 Express.</String>
<String Name="InvalidPlatformXP">Windows XP Service Pack 2 or later is required to install SQL Server 2008 R2 Express.</String>
<String Name="InvalidPlatform2K3">Windows 2003 Service Pack 2 or later is required to install SQL Server 2008 R2 Express.</String>
<String Name="MissingMSXml">SQL Server 2008 R2 Express requires MSXML. Please ensure MSXML is installed properly.</String>
<String Name="InsufficientHardware">The current system does not meet the minimum hardware requirements for SQL Server 2008 R2 Express. Contact your application vendor.</String>
<String Name="InvalidPlatformOSServicePacks">The current operating system does not meet Service Pack level requirements for SQL Server 2008 R2 Express. Install the most recent Service Pack from the Microsoft download center at http://www.microsoft.com/downloads before continuing setup.</String>
<String Name="InvalidPlatformIE">This version of SQL Server 2008 R2 Express requires Internet Explorer version 6.0 with SP1 or later. To proceed, install or upgrade to a required version of Internet Explorer and then run setup again.</String>
<String Name="AnotherInstanceRunning">Another instance of setup is already running. The running instance must complete before this setup can proceed.</String>
<String Name="BetaComponentsFailure">A beta version of the .NET Framework 2.0 or SQL Server was detected on the computer. Uninstall any previous beta versions of SQL Server 2008 R2 components, SQL Server Support Files, or .NET Framework 2.0 before continuing.</String>
<String Name="InvalidPlatformArchitecture">This version of SQL Server 2008 R2 Express is not supported for the current processor architecture.</String>
<String Name="InvalidUpgradeNotExpress">The instance of SQL Server 2005 named 'SQLEXPRESS' is a not an instance of SQL Server Express. It cannot be upgraded to SQL Server 2008 R2 Express.</String>
<String Name="InvalidUpgradeNotExpressCore">The instance of SQL Server 2005 Express named 'SQLEXPRESS' contains components that are not included in SQL Server 2008 R2 Express. SQL Server 2008 R2 Express SP1 cannot upgrade this instance. Please use SQL Server 2008 R2 Express with Advanced Services instead.</String>
<String Name="InvalidUpgradeLanguage">The instance of SQL Server 2005 Express named 'SQLEXPRESS' is a different language version than this SQL Server 2008 R2 Express. SQL Server 2008 R2 Express cannot upgrade this instance.</String>
<String Name="InvalidUpgradeWoW">SQL Server 2008 R2 Express (x64) cannot upgrade the existing instance of SQL Server 2005 Express (x64 WoW) named 'SQLEXPRESS'. Uninstall this instance of SQL Server 2005 Express and retry installing SQL Server 2008 R2 Express (x64).</String>
</Strings>
</Package>
回答2:
The code in this project is built for SQL2005, but it looks like it could pretty easily be used to deploy SQL2008.
http://www.codeproject.com/KB/applications/NET_Installer_With_SQLEXP.aspx
It also supports an instance name of your choice. It will need some tweaking for sure, but it seems to support the basic tenants of what you're trying to do.
回答3:
I'm going to go ahead and answer my own question for the sake of anyone else who comes looking for this sort of information on SO...from everything that I've been able to tell, it just isn't possible to install a custom instance of SQL Server (2008 anyway, and probably 2005) that is linked to the installation of custom software without going down the road of either a custom bootstrapper or a third-party installer product (InstallShield and the like). It sounds like SQL Server Compact edition might be better suited.
回答4:
Don't know if anyone is still tracking this. Perhaps you could take a look at this:
http://msdn.microsoft.com/en-us/library/dd981032(SQL.100).aspx
Haven't tried it, but am looking to solve exactly the same issue posted by Adam.
回答5:
One approach would be to include the SQL Server 2008 Express install package and then use a custom action in your Windows installer to fire off the silent, background installation of SQL Server 2008 Express.
The package is a standard MSI package - you should be able to set a boatload of properties on the command-line, when installing the MSI.
Here's a sample I found:
sqlexpr.exe /qb instancename="MACHINENAMESQLEXPRESS2008"
SQLAUTOSTART=1 SAPWD="PWD" SECURITYMODE=SQL DISABLENETWORKPROTOCOLS=0"
The full list of command line properties ought to be available at Microsoft or in the help file for SQL Server 2008 Express somewhere, I'm sure.
Marc
来源:https://stackoverflow.com/questions/682047/including-a-named-instance-of-sql-server-2008-express-with-my-application