+@if (_manual.Count > 0)
+{
+ Skal tjekkes manuelt
@_manual.Count regler
+ Emnet er relevant, men denne SQL Server-version kan ikke måle det, som SQLInsight Pro gør. Tjek det selv som beskrevet; det tæller ikke som "ikke målbar".
+
+ | Regel | | Sådan tjekkes det |
+
+ @foreach (var r in _manual)
+ {
+ | @r.RuleId | @r.RuleTitle | @r.Reason |
+ }
+
+
+}
+
Ikke målbart på denne instans
@if (_notMeasurable.Count == 0)
{
@@ -252,6 +267,7 @@ else
private IReadOnlyList _resolved = [];
private IReadOnlyList _notMeasurable = [];
private IReadOnlyList _notApplicable = [];
+ private IReadOnlyList _manual = [];
private readonly Dictionary> _metrics = [];
private SQLInsight.Reports.MetricContext _context = new();
private IReadOnlyList _waits = [];
@@ -277,6 +293,7 @@ else
var states = await Repository.GetRuleStatesAsync(id);
_notMeasurable = states.Where(r => r.Outcome is RuleOutcome.NotMeasurable or RuleOutcome.Error).ToList();
_notApplicable = states.Where(r => r.Outcome == RuleOutcome.NotApplicable).ToList();
+ _manual = states.Where(r => r.Outcome == RuleOutcome.ManualCheck).ToList();
foreach (var definition in SQLInsight.Reports.TimeWindowAnalysis.MetricDefinitions)
{
_metrics[definition.Metric] = await Repository.GetMetricAsync(id, definition.Metric, day);
diff --git a/tests/SQLInsight.Agent.Tests/ComplianceControlTests.cs b/tests/SQLInsight.Agent.Tests/ComplianceControlTests.cs
index 028b39a..0be184b 100644
--- a/tests/SQLInsight.Agent.Tests/ComplianceControlTests.cs
+++ b/tests/SQLInsight.Agent.Tests/ComplianceControlTests.cs
@@ -18,11 +18,14 @@ public class ComplianceControlTests
new InstanceRuleState("SQL01", "SQLI-DB-009", RuleOutcome.NotMeasurable, "Adgang nægtet"),
new InstanceRuleState("SQL02", "SQLI-DB-009", RuleOutcome.Passed, null),
new InstanceRuleState("SQL03", "SQLI-DB-010", RuleOutcome.Findings, null),
+ new InstanceRuleState("SQL2014", "SQLI-DB-009", RuleOutcome.ManualCheck, "Kan ikke måles på SQL Server 2014 – tjek manuelt"),
+ new InstanceRuleState("SQL2014", "SQLI-DB-010", RuleOutcome.Passed, null),
};
Assert.Equal(ControlStatus.NotApplicable, Integrity.StatusOn("KGAA-S05", states));
Assert.Equal(ControlStatus.NotMeasured, Integrity.StatusOn("SQL01", states)); // a real gap stays a gap
Assert.Equal(ControlStatus.Met, Integrity.StatusOn("SQL02", states));
Assert.Equal(ControlStatus.NotMet, Integrity.StatusOn("SQL03", states)); // a finding always counts
+ Assert.Equal(ControlStatus.ManualCheck, Integrity.StatusOn("SQL2014", states)); // relevant, but checked by hand
}
}
diff --git a/tests/SQLInsight.IntegrationTests/WebApiTests.cs b/tests/SQLInsight.IntegrationTests/WebApiTests.cs
index cb8e1f4..e7ef14a 100644
--- a/tests/SQLInsight.IntegrationTests/WebApiTests.cs
+++ b/tests/SQLInsight.IntegrationTests/WebApiTests.cs
@@ -167,7 +167,8 @@ public class ApiV1Tests(SqlServerFixture sql) : IAsyncLifetime
}).ToArray();
await _repository.SaveRuleResultsAsync(_instanceId,
[new RuleResult { RuleId = "SQLI-DB-007", RuleTitle = "Fuld backup", Outcome = RuleOutcome.Findings, Findings = findings },
- new RuleResult { RuleId = "LOCAL-AX-001", RuleTitle = "Lokal regel", Outcome = RuleOutcome.Passed }], now);
+ new RuleResult { RuleId = "LOCAL-AX-001", RuleTitle = "Lokal regel", Outcome = RuleOutcome.Passed },
+ new RuleResult { RuleId = "SQLI-DB-009", RuleTitle = "CHECKDB", Outcome = RuleOutcome.ManualCheck, Reason = "Kan ikke måles på SQL Server 2014 – tjek manuelt. Se dbi_dbccLastKnownGood." }], now);
await _repository.SaveCollectedAsync(_instanceId, "wait-sampling", WaitSampling.Aggregate(
[new WaitingRequest(60, "LCK_M_U", 3000, "AXDB", "0xAB", "UPDATE NUMBERSEQUENCETABLE SET NEXTREC = 1", 55)], now.AddMinutes(-1)));
@@ -281,6 +282,24 @@ public class ApiV1Tests(SqlServerFixture sql) : IAsyncLifetime
Assert.Equal(1, all.GetProperty("instances").GetArrayLength());
}
+
+ [Fact]
+ public async Task Manual_checks_are_their_own_outcome_on_pages_and_in_the_api()
+ {
+ var client = _factory.CreateClient();
+ var states = await GetJsonAsync($"/api/v1/instances/{Uri.EscapeDataString(Name)}/rule-states");
+ var instances = await GetJsonAsync("/api/v1/instances");
+ var page = await client.GetStringAsync($"/instanser/{Uri.EscapeDataString(Name)}");
+ var home = await client.GetStringAsync("/");
+
+ Assert.Contains(states.EnumerateArray(), s => s.GetProperty("ruleId").GetString() == "SQLI-DB-009" && s.GetProperty("outcome").GetString() == "manualCheck");
+ var instance = Assert.Single(instances.EnumerateArray());
+ Assert.Equal(1, instance.GetProperty("manualChecks").GetInt32());
+ Assert.Equal(0, instance.GetProperty("notMeasurable").GetInt32());
+ Assert.Contains("Skal tjekkes manuelt", page, StringComparison.Ordinal);
+ Assert.Contains("dbi_dbccLastKnownGood", page, StringComparison.Ordinal);
+ Assert.Contains("skal tjekkes manuelt", home, StringComparison.Ordinal);
+ }
[Fact]
public async Task Openapi_describes_every_api_v1_endpoint()
{
diff --git a/tests/SQLInsight.Rules.Tests/DatabaseRuleTests.cs b/tests/SQLInsight.Rules.Tests/DatabaseRuleTests.cs
index d8de50e..1313d6d 100644
--- a/tests/SQLInsight.Rules.Tests/DatabaseRuleTests.cs
+++ b/tests/SQLInsight.Rules.Tests/DatabaseRuleTests.cs
@@ -147,13 +147,19 @@ public class DatabaseRuleTests
}
[Fact]
- public void CheckDb_is_not_applicable_before_2016_sp2()
+ public void CheckDb_before_2016_sp2_must_be_checked_by_hand()
{
var result = Run(new CheckDbRule(), WithVersion("13.0.4001.0", DatabaseList(Database())));
- Assert.Equal(RuleOutcome.NotApplicable, result.Outcome);
+ Assert.Equal(RuleOutcome.ManualCheck, result.Outcome);
+ Assert.Contains("tjek manuelt", result.Reason, StringComparison.Ordinal);
+ Assert.Contains("dbi_dbccLastKnownGood", result.Reason, StringComparison.Ordinal);
}
+ [Fact]
+ public void Query_store_before_2016_is_not_relevant_rather_than_a_manual_check() =>
+ Assert.Equal(RuleOutcome.NotApplicable, Run(new QueryStoreStateRule(), WithVersion("12.0.6024.0", DatabaseList(Database()))).Outcome);
+
[Fact]
public void Suspect_pages_ignore_repaired_pages()
{
diff --git a/tests/SQLInsight.Rules.Tests/PlanRuleTests.cs b/tests/SQLInsight.Rules.Tests/PlanRuleTests.cs
index 0dbda6f..4a51ff8 100644
--- a/tests/SQLInsight.Rules.Tests/PlanRuleTests.cs
+++ b/tests/SQLInsight.Rules.Tests/PlanRuleTests.cs
@@ -86,9 +86,9 @@ public class PlanRuleTests
}
[Fact]
- public void Memory_rules_are_not_applicable_without_the_columns()
+ public void Memory_rules_must_be_checked_by_hand_without_the_columns()
{
- Assert.Equal(RuleOutcome.NotApplicable, Run(new SpillRule(), WithVersion("14.0.1000.169", new PlanAnalysisSnapshot { CapturedAt = Now, Statements = [] })).Outcome);
+ Assert.Equal(RuleOutcome.ManualCheck, Run(new SpillRule(), WithVersion("14.0.1000.169", new PlanAnalysisSnapshot { CapturedAt = Now, Statements = [] })).Outcome);
}
[Fact]