Fix invalid CertificateCheckUrl column errors on existing databases.

Auto-migrate SonicContainer schema on startup, rename legacy typo columns, and use fallback SQL when the column is not yet present.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-08-03 13:24:20 +02:00
co-authored by Cursor
parent 76e280d809
commit 0a449727ad
5 changed files with 362 additions and 36 deletions
@@ -31,7 +31,7 @@ public sealed class DeploymentTargetRepository
nameof(environmentCode));
}
const string sql = """
const string sqlWithCheckUrl = """
SELECT
target.[CertificateTargetId],
target.[TargetDirectory],
@@ -75,11 +75,63 @@ public sealed class DeploymentTargetRepository
target.[TargetFileName];
""";
const string sqlWithoutCheckUrl = """
SELECT
target.[CertificateTargetId],
target.[TargetDirectory],
target.[TargetFileName],
target.[BackupEnabled],
target.[BackupDirectoryName],
target.[IsActive] AS [TargetIsActive],
container.[SonicContainerId],
container.[ContainerName],
container.[ContainerDisplayName],
container.[RestartTimeoutSeconds],
connection.[ConnectionName],
environment.[EnvironmentCode],
environment.[SortOrder] AS [EnvironmentSortOrder],
company.[CompanyCode]
FROM [dbo].[CertificateTarget] AS target
INNER JOIN [dbo].[SonicContainer] AS container
ON container.[SonicContainerId] = target.[SonicContainerId]
INNER JOIN [dbo].[SonicConnection] AS connection
ON connection.[SonicConnectionId] = container.[SonicConnectionId]
INNER JOIN [dbo].[Environment] AS environment
ON environment.[EnvironmentId] = connection.[EnvironmentId]
INNER JOIN [dbo].[Company] AS company
ON company.[CompanyId] = container.[CompanyId]
WHERE target.[IsActive] = 1
AND container.[IsActive] = 1
AND connection.[IsActive] = 1
AND company.[IsActive] = 1
AND environment.[IsActive] = 1
AND environment.[EnvironmentCode] = @EnvironmentCode
ORDER BY
company.[CompanyCode],
environment.[SortOrder],
container.[ContainerName],
target.[TargetDirectory],
target.[TargetFileName];
""";
List<DeploymentTarget> targets = [];
await using SqlConnection connection = new(_connectionString);
await connection.OpenAsync(cancellationToken);
bool hasCertificateCheckUrl =
await DatabaseSchemaPatcher.HasCertificateCheckUrlColumnAsync(
_connectionString,
cancellationToken);
string sql = hasCertificateCheckUrl
? sqlWithCheckUrl
: sqlWithoutCheckUrl;
await using SqlCommand command = new(sql, connection);
command.Parameters.Add(
@@ -120,8 +172,9 @@ public sealed class DeploymentTargetRepository
int containerDisplayNameOrdinal =
reader.GetOrdinal("ContainerDisplayName");
int certificateCheckUrlOrdinal =
reader.GetOrdinal("CertificateCheckUrl");
int? certificateCheckUrlOrdinal = hasCertificateCheckUrl
? reader.GetOrdinal("CertificateCheckUrl")
: null;
int restartTimeoutOrdinal =
reader.GetOrdinal("RestartTimeoutSeconds");
@@ -149,9 +202,11 @@ public sealed class DeploymentTargetRepository
containerDisplayNameOrdinal);
string? certificateCheckUrl =
ReadNullableString(
reader,
certificateCheckUrlOrdinal);
certificateCheckUrlOrdinal is int checkUrlOrdinal
? ReadNullableString(
reader,
checkUrlOrdinal)
: null;
string companyCode =
reader.GetString(companyCodeOrdinal);