Skip to content

Commit bf69c20

Browse files
Merge pull request #326 from erikdarlingdata/feature/preserve-jobs
Add --preserve-jobs flag to CLI and GUI installers
2 parents 2b88082 + bd0569b commit bf69c20

6 files changed

Lines changed: 174 additions & 107 deletions

File tree

Installer/Program.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ static async Task<int> Main(string[] args)
9595
Console.WriteLine(" -h, --help Show this help message");
9696
Console.WriteLine(" --reinstall Drop existing database and perform clean install");
9797
Console.WriteLine(" --reset-schedule Reset collection schedule to recommended defaults");
98+
Console.WriteLine(" --preserve-jobs Keep existing SQL Agent jobs (owner, schedule, notifications)");
9899
Console.WriteLine(" --encrypt=<level> Connection encryption: mandatory (default), optional, strict");
99100
Console.WriteLine(" --trust-cert Trust server certificate without validation");
100101
Console.WriteLine();
@@ -115,6 +116,7 @@ static async Task<int> Main(string[] args)
115116
bool automatedMode = args.Length > 0;
116117
bool reinstallMode = args.Any(a => a.Equals("--reinstall", StringComparison.OrdinalIgnoreCase));
117118
bool resetSchedule = args.Any(a => a.Equals("--reset-schedule", StringComparison.OrdinalIgnoreCase));
119+
bool preserveJobs = args.Any(a => a.Equals("--preserve-jobs", StringComparison.OrdinalIgnoreCase));
118120
bool trustCert = args.Any(a => a.Equals("--trust-cert", StringComparison.OrdinalIgnoreCase));
119121

120122
/*Parse encryption option (default: Mandatory)*/
@@ -135,6 +137,7 @@ static async Task<int> Main(string[] args)
135137
var filteredArgs = args
136138
.Where(a => !a.Equals("--reinstall", StringComparison.OrdinalIgnoreCase))
137139
.Where(a => !a.Equals("--reset-schedule", StringComparison.OrdinalIgnoreCase))
140+
.Where(a => !a.Equals("--preserve-jobs", StringComparison.OrdinalIgnoreCase))
138141
.Where(a => !a.Equals("--trust-cert", StringComparison.OrdinalIgnoreCase))
139142
.Where(a => !a.StartsWith("--encrypt=", StringComparison.OrdinalIgnoreCase))
140143
.ToArray();
@@ -653,6 +656,16 @@ INSERT...WHERE NOT EXISTS re-populates with current recommended values
653656
Console.Write("(resetting schedule) ");
654657
}
655658

659+
/*
660+
Preserve existing SQL Agent jobs if requested — flip the T-SQL
661+
variable so existing jobs are left untouched during upgrade
662+
*/
663+
if (preserveJobs && fileName.StartsWith("45_", StringComparison.Ordinal))
664+
{
665+
sqlContent = sqlContent.Replace("@preserve_jobs bit = 0", "@preserve_jobs bit = 1");
666+
Console.Write("(preserving existing jobs) ");
667+
}
668+
656669
/*
657670
Remove SQLCMD directives (:r includes) as we're executing files directly
658671
*/

InstallerGui/MainWindow.xaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,12 @@
186186
Margin="0,0,0,10"
187187
Foreground="{DynamicResource ForegroundBrush}"/>
188188

189+
<!-- Preserve Jobs Checkbox -->
190+
<CheckBox x:Name="PreserveJobsCheckBox"
191+
Content="Keep existing SQL Agent jobs (owner, schedule, notifications)"
192+
Margin="0,0,0,10"
193+
Foreground="{DynamicResource ForegroundBrush}"/>
194+
189195
<!-- Validation Checkbox -->
190196
<CheckBox x:Name="ValidationCheckBox"
191197
Content="Run validation after install (recommended)"

InstallerGui/MainWindow.xaml.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -401,11 +401,13 @@ Execute installation
401401
Community dependencies install automatically before validation (98_validate)
402402
*/
403403
bool resetSchedule = ResetScheduleCheckBox.IsChecked == true;
404+
bool preserveJobs = PreserveJobsCheckBox.IsChecked == true;
404405
_installationResult = await InstallationService.ExecuteInstallationAsync(
405406
_connectionString,
406407
_sqlFiles,
407408
isCleanInstall,
408409
resetSchedule,
410+
preserveJobs,
409411
progress,
410412
preValidationAction: async () =>
411413
{

InstallerGui/Services/InstallationService.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,7 @@ public static async Task<InstallationResult> ExecuteInstallationAsync(
325325
List<string> sqlFiles,
326326
bool cleanInstall,
327327
bool resetSchedule = false,
328+
bool preserveJobs = false,
328329
IProgress<InstallationProgress>? progress = null,
329330
Func<Task>? preValidationAction = null,
330331
CancellationToken cancellationToken = default)
@@ -422,6 +423,17 @@ Execute SQL files
422423
});
423424
}
424425

426+
/*Preserve existing SQL Agent jobs if requested*/
427+
if (preserveJobs && fileName.StartsWith("45_", StringComparison.Ordinal))
428+
{
429+
sqlContent = sqlContent.Replace("@preserve_jobs bit = 0", "@preserve_jobs bit = 1");
430+
progress?.Report(new InstallationProgress
431+
{
432+
Message = "Preserving existing SQL Agent jobs...",
433+
Status = "Info"
434+
});
435+
}
436+
425437
/*Remove SQLCMD directives*/
426438
sqlContent = SqlCmdDirectivePattern.Replace(sqlContent, "");
427439

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ A GUI installer (`PerformanceMonitorInstallerGui.exe`) is also included in the r
146146
| `USERNAME PASSWORD` | SQL Authentication credentials (positional, optional) |
147147
| `--reinstall` | Drop existing database and perform clean install |
148148
| `--reset-schedule` | Reset collection schedule to recommended defaults during upgrade |
149+
| `--preserve-jobs` | Keep existing SQL Agent jobs unchanged (owner, schedule, notifications) |
149150
| `--encrypt=optional\|mandatory\|strict` | Connection encryption level (default: mandatory) |
150151
| `--trust-cert` | Trust server certificate without validation (default: require valid cert) |
151152

0 commit comments

Comments
 (0)