v0.5.0-rc1 is a release candidate. Run on the SQL server in elevated 64-bit Windows PowerShell 5.1. Test against a restored non-production copy before a new production campaign. Runbook, migration, test evidence and limits.
$ErrorActionPreference = 'Stop'
if ($PSVersionTable.PSVersion.Major -le 5) { [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 }
$installer = Join-Path $env:TEMP 'Install-SqlExpressUpgrade-v0.5.0-rc1.ps1'
Invoke-WebRequest 'https://raw.githubusercontent.com/zymbytskyi/sql-express-upgrade/v0.5.0-rc1/Install.ps1' -OutFile $installer -UseBasicParsing
Unblock-File $installer
Set-ExecutionPolicy -Scope Process RemoteSigned -Force
& $installerThe installer verifies the GitHub release ZIP digest and installs into its own
versioned folder. Rerunning opens that version's menu. Close older menus first.
Runtime is C:\SqlExpressUpgradeData; never publish runtime, logs, backups or credentials.
A single eligible local instance is automatic; multiple source instances require a choice.
No VM name, remote credentials or Hyper-V module is required for the SQL workflow.
| Item | Behavior |
|---|---|
| 1 Prepare | Download/reuse English SQL 2022 Express media; discover and approve the latest CU; verify signature/build and pin its SHA256 locally. Generate text plan. Repeated preparation reuses the pinned CU offline. |
| 2 Backups | Choose capacity-ranked local folder; COPY_ONLY, CHECKSUM and VERIFYONLY. No compression, restore or CHECKDB. Restart indicators do not block valid backups. |
| 3 Final readiness | Current upgrade prerequisites plus persisted VERIFYONLY evidence. Report backup age, files and mode. Completed backup-time verification is reused. |
| 4 Upgrade | Validate pinned CU and cached backup evidence; open interactive Setup with UpdateEnabled=True and a dedicated local UpdateSource. No automatic Upgrade click/restart; no RTM fallback. |
| 5 Quick Verify | Require the exact prepared CU build on initial acceptance, databases ONLINE, restart and approved compatibility. Record integrated servicing as Verified; never repeat installation. |
| 6 Recovery plan | Provider-neutral text with recorded recovery reference. SQL 2017 backups remain necessary for SQL 2017 recovery. |
| 7 Optional rehearsal | Confirm full user backup restores into unique scratch databases plus CHECKDB, after space/workload explanation. Failed tests are retained for diagnosis. |
| 8 Patch | Review live Microsoft CU/security candidates and explicit target; optional 0/1/2 backups; selected-instance patch with progress/log locations and explicit restart choice. |
| 9 Optional CHECKDB | Confirm full database integrity scans separately from quick verification. |
| 10 Register backups | Inspect manual full backup headers, server/database/version/checksum identity, run VERIFYONLY and hash; register without changing files. |
| 11 External recovery | Record provider, recovery reference and tested procedure, including Azure Backup. No provider backup is created automatically. |
| 12 Optional compatibility 160 | After patch verification, select user databases, confirm vendor support, record old/new levels and revert commands. Never system databases. |
| 13 Summary | Source/final build, patch KB/status, databases, validation evidence, compatibility changes, backup files and required application acceptance. |
| 14 Existing compatibility approval | Migration only: explicitly register already-approved existing level-160 changes, with no ALTER. |
Every action shows START/SUCCESS/FAILED, elapsed time and an Enter pause. Long SQL operations and quiet patch installation report elapsed time; patching also reports installer processes and the latest Setup log path. Application services are never stopped/started by guessing their names.
SQL source language comes from the SQL registry, not Windows display language.
This release supports English source SQL (1033) only, including German Windows.
Existing valid SQL 2022 bootstrapper/media is reused. Bootstrapper download uses
/LANGUAGE=en-US; incorrect results fall back to the verified version-specific
Microsoft ENU full-media URL. Files are not renamed to impersonate another language.
Invalid/partial artifacts are retained separately; rerun Prepare to recover.
After extraction the language pack XML and x64 engine MSI are checked as well as
Microsoft signatures and SQL 2022 Express metadata. Unsupported source language
fails explicitly. Evergreen Microsoft links can point to a different SQL major.
Default capacity is 120% of allocated database files plus 2 GiB reserve, without
scratch restore space. Full rehearsal checks its additional allocation separately.
New dedicated folders grant the selected SQL service SID Modify; existing ACLs stay
unchanged. Never grant Everyone/drive-root permissions. Copy local backups off-server.
Recognizable sanitized database names, timestamps and GUIDs avoid filename collisions.
Previous .bak sets and historical manifests are retained. Post-upgrade backups use
a separate backups-2022.json; use menu 2 to choose a dedicated post-upgrade folder.
Validation binds computer/instance, plan, live build/scope/compatibility, manifest, mode, storage, expected hashes and current file sizes/modified times. First validation hashes files. Subsequent launcher checks use immutable recorded hashes plus metadata instead of rescanning large files. This is an operational cache, not protection from an attacker deliberately preserving timestamps and altering files/state. Keep runtime and backups protected. To force a revalidation, retain/archive the relevant validation JSON and run menu 3 again. A change causes an explicit invalidation reason.
VERIFYONLY does not prove full restore/CHECKDB. Technical PASS does not prove
application acceptance or external recovery. Base RTM media and a separately cached
CU are integrated in one Setup operation. Menu 8 is optional subsequent servicing.
An optional Hyper-V host helper remains separate under optional/. It is not used
for Azure/other VM platforms. No in-place SQL downgrade is provided.
Discovery/download/signature helpers derive from
sql-server-2022-express-self-patch
commit c528b6d1e17bf3621549ac73e3685fb7cd1b1062, under the included MIT notice.
The upstream interactive entry point is not executed. The wrapper adds explicit
CU/security-table review, target/build validation, durable restart state, progress,
backup integration and selected-instance arguments; it never uses /AllInstances.
The latest CU downloads automatically from Microsoft Download Center. If a newer security target is listed, the operator supplies its exact official Microsoft EXE URL from that KB. Published SHA256, when supplied by Microsoft, can be pasted and is verified; otherwise Authenticode and the exact expected package build are required, and a local SHA256 is recorded/displayed. A local hash alone is not publisher proof. An unreadable servicing page, unexpected package build/signature or pending restart blocks patch execution. Servicing-target approval is explicit, not a claim that the application vendor supports the latest CU. Shared SQL components can also be serviced.
The Microsoft Update checkbox controls future Windows Update scans. Include SQL
Server product updates (UpdateEnabled) affects the current Setup operation.
The major-upgrade launcher uses /UPDATEENABLED=True, a local /UPDATESOURCE,
and /UIMODE=Normal. Keep Include SQL Server product updates selected and
confirm the pinned KB in the Wizard. Missing/changed CU files block the launcher;
an unexpected resulting build blocks initial acceptance.
slipstream.json records the approved CU, build, source, SHA256 and campaign identity.
Menu 1 selects the latest CU from Microsoft Download Center; it does not claim
to incorporate a newer standalone CU-branch security release automatically. Review
Microsoft's servicing table/KB known issues before approval. Menu 8 remains available
for later security/CU maintenance. No network refresh occurs on the upgrade day.
To deliberately change the pinned CU before upgrading, retain the old slipstream.json
under a dated archive name, rerun menu 1 and repeat menu 3 and your rehearsal. Do not
change the target after opening Setup. Old update packages remain in separate folders.
Runtime integrity relies on administrator-controlled files, not an adversarial trust boundary.