Compare commits

...

3 commits

Author SHA1 Message Date
Claude
63b54a8a68
README: support SQL Server 2000 and later with a capability-based version matrix
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E3EExwndy8Z22EK2Qpt6BK
2026-09-29 05:13:03 +00:00
Claude
9792b54480
README: harden design principles from a DBA/DevOps review
Least-privilege permissions per version, collector overhead safeguards,
separate repository instance, controlled/offline updates, container test
matrix, and SQL Server 2016 marked as out of support.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E3EExwndy8Z22EK2Qpt6BK
2026-09-29 05:07:18 +00:00
Claude
bb16f2272e
Add README with vision, business model, architecture and roadmap
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E3EExwndy8Z22EK2Qpt6BK
2026-09-29 05:06:16 +00:00

240
README.md Normal file
View file

@ -0,0 +1,240 @@
# SQLInsight Pro
**Gratis, on-prem overvågning af SQL Server med dyb ekspertise indbygget. Betalt support til dem der har brug for det.**
SQLInsight Pro er et overvågningsværktøj til Microsoft SQL Server, skrevet i C# på .NET. Det kører hos kunden og forlader ikke netværket, medmindre kunden selv vælger det. Værktøjet nøjes ikke med at vise tal. Det forklarer, hvad der er galt, hvorfor det er et problem, og hvordan det løses. Rådene har samme niveau som dem, man får fra en erfaren DBA.
> **Status:** Projektet er i idéfasen. Der er endnu ingen kode. Se [Roadmap](#roadmap).
---
## Vision
De fleste gratis værktøjer til SQL Server kan vise, *at* noget er galt, fx blocking, høj CPU eller lange ventetider. Men de siger sjældent *hvorfor*, og endnu sjældnere *hvad man skal gøre*. De kommercielle værktøjer er dyre og låser ofte den vigtigste viden bag en licens.
SQLInsight Pro vil gøre det anderledes:
1. **Hele produktet er gratis.** Overvågning, analyse og anbefalinger koster ikke noget. Vi fjerner ikke funktioner for at sælge en betalt version.
2. **Dyb SQL Server-ekspertise.** Hvert fund kommer med en forklaring, en vurdering af alvor, konkret evidens og et forslag til løsning, fx et script, en konfiguration eller en ændring af et index.
3. **On-prem først.** Agenten, databasen og web-UI'et kører i kundens eget miljø. Der sendes ingen data ud, uden at kunden aktivt har slået det til.
4. **Altid opdateret.** Selve værktøjet og regel-/vidensbasen opdateres løbende, så nye SQL Server-versioner, CU'er og kendte fejl bliver dækket.
5. **Betalt support er en service, ikke en funktion.** Kunder, der betaler, får adgang til mennesker med prioritet, og ikke til flere knapper i programmet.
---
## Forretningsmodel
| | **Community** | **Professional** | **Enterprise** |
|---|---|---|---|
| Pris | Gratis | Abonnement | Abonnement |
| Al overvågning og analyse | ✅ | ✅ | ✅ |
| Opdateringer af værktøj og regelpakker | ✅ | ✅ | ✅ |
| Community support (GitHub Discussions / forum) | ✅ | ✅ | ✅ |
| Prioriteret mailsupport med svartidsgaranti | – | ✅ | ✅ |
| Telefonsupport | – | – | ✅ |
| Findings-sync til SQLInsight Hub (proaktiv opfølgning) | – | Valgfrit | ✅ |
| Hjælp til fortolkning af fund og tuning | – | Begrænset | ✅ |
Professional og Enterprise låser ikke op for funktioner i softwaren. De giver adgang til **ekspertise og svartid**. Når en betalende kunde slår *findings-sync* til, kan supportteamet se kundens aktuelle problemer, før kunden ringer.
---
## Hvad analyseres? (dyb ekspertise, ikke kun låsninger)
Blocking og deadlocks er kun ét område. Regelmotoren dækker hele SQL Server-instansen:
**Performance**
- Wait statistics med fortolkning (hvilke waits er normale, og hvilke peger på et reelt problem)
- Blocking-kæder, head blockers og deadlock-grafer med analyse af årsagen
- Query Store: plan-regressioner, forcerede planer der fejler, og queries med høj varians
- Parameter sniffing og planer, der er følsomme over for parametre
- Plan cache-analyse: implicitte konverteringer, key lookups, spills, manglende statistikker og for store memory grants
- CPU-pres, scheduler-pres og worker thread exhaustion
- Memory grants, RESOURCE_SEMAPHORE og buffer pool-pres
- I/O-latens pr. fil og pr. database
- TempDB-contention (PFS/GAM/SGAM) og konfiguration af TempDB
**Indexes og statistikker**
- Manglende indexes, vurderet kritisk (ikke bare DMV-forslagene ukritisk videregivet)
- Ubrugte, duplikerede og overlappende indexes
- Forældede statistikker og ascending key-problemer
- Heaps med forwarded records
**Konfiguration og best practice**
- MAXDOP, cost threshold for parallelism, max server memory og optimize for ad hoc workloads
- Database scoped configurations og compatibility level
- Antal VLF'er, autogrowth-indstillinger og placering af filer
- Trace flags og deres relevans for den aktuelle version
**Drift og sikkerhed for data**
- Backup-dækning og RPO i forhold til recovery model
- Status for DBCC CHECKDB og tegn på korruption (suspect pages, 823/824/825)
- Sundhed for Always On Availability Groups (send/redo queue, synkroniseringsstatus)
- SQL Agent-jobs der fejler, og vigtige fejl i error log
**Version og patch-niveau**
- Registrering af SQL Server-version, edition og CU-niveau
- Advarsel ved manglende CU'er eller sikkerhedsopdateringer og ved versioner, der ikke længere supporteres
- Kendte fejl, der rammer den installerede build, med link til Microsofts dokumentation
Hvert **finding** indeholder:
- **Titel og alvor** (Info / Lav / Middel / Høj / Kritisk)
- **Evidens**: de konkrete målinger, queries eller objekter, der udløste fundet
- **Forklaring**: hvorfor det er et problem, skrevet så både DBA'er og udviklere kan følge med
- **Anbefaling**: konkrete trin og, hvor det giver mening, et script (som aldrig køres automatisk)
- **Referencer**: Microsoft Learn og anden anerkendt dokumentation
---
## Arkitektur
```
┌──────────────────────── Kundens netværk (on-prem) ────────────────────────┐
│ │
│ ┌───────────────┐ DMV'er, Query Store, ┌──────────────────────────┐ │
│ │ SQL Server(e) │◄──Extended Events───────►│ SQLInsight Agent │ │
│ └───────────────┘ │ (Windows Service / │ │
│ │ Linux systemd) │ │
│ │ • Collectors │ │
│ │ • Regelmotor + regelpak.│ │
│ └────────────┬─────────────┘ │
│ │ │
│ ┌────────────▼─────────────┐ │
│ │ Lokalt repository │ │
│ │ (SQL Server-database) │ │
│ └────────────┬─────────────┘ │
│ │ │
│ ┌────────────▼─────────────┐ │
│ │ SQLInsight Web │ │
│ │ (ASP.NET Core + Blazor) │ │
│ └────────────┬─────────────┘ │
└──────────────────────────────────────────────────────────┼────────────────┘
│ HTTPS (opt-in,
│ kun betalende)
┌────────────▼─────────────┐
│ SQLInsight Hub │
│ Ingestion API │
│ (ASP.NET Core) │
└────────────┬─────────────┘
│
┌────────────▼─────────────┐
│ PostgreSQL │
│ Findings fra alle │
│ betalende kunder │
└──────────────────────────┘
```
### Komponenter
| Komponent | Teknologi | Ansvar |
|---|---|---|
| **SQLInsight.Agent** | .NET Worker Service | Indsamler data, kører regelmotoren og gemmer fund lokalt |
| **SQLInsight.Rules** | C#-bibliotek + versionerede regelpakker | Den samlede SQL Server-ekspertise som testbare regler |
| **SQLInsight.Web** | ASP.NET Core + Blazor | Dashboard, fund, historik, trends og administration |
| **SQLInsight.Updater** | .NET | Tjekker for og installerer nye versioner af værktøj og regelpakker |
| **SQLInsight.Hub** | ASP.NET Core + EF Core (Npgsql) | Centralt API, der modtager fund fra betalende kunder og skriver dem til PostgreSQL |
| **SQLInsight.Hub.Portal** | ASP.NET Core + Blazor | Internt overblik: hvilke kunder har hvilke problemer, og hvor alvorlige er de? |
### Designprincipper
- **Least privilege, aldrig sysadmin.** Agenten ændrer aldrig noget på de overvågede servere. Rettighederne leveres som ét versionsafhængigt script:
- `VIEW SERVER STATE`. På SQL Server 2022+ bruges de mere granulære `VIEW SERVER PERFORMANCE STATE` og `VIEW SERVER SECURITY STATE`.
- `VIEW DATABASE STATE` i hver database, som Query Store-data skal læses fra.
- Læseadgang til `msdb`, som giver backup-historik og SQL Agent-jobs.
- Seneste gode CHECKDB læses med `DATABASEPROPERTYEX(..., 'LastGoodCheckDbTime')` og ikke med `DBCC DBINFO`, som kræver sysadmin.
- Tjenesten kører som gMSA med Windows-autentificering. SQL-login understøttes kun, hvor det er nødvendigt.
- **Lav overhead, målt og ikke antaget.**
- Alle DMV-queries kører med `SET LOCK_TIMEOUT`, `SET DEADLOCK_PRIORITY LOW`, korte command timeouts og `READ UNCOMMITTED`.
- Tunge kilder hentes i trin med en grænse for rækker og bytes. Det gælder især plan cache med showplan-XML og `sys.dm_db_index_physical_stats`, der altid bruges i `LIMITED`-mode.
- Kumulative tællere som wait stats, file stats og query stats lagres som deltaer mellem snapshots. Tidspunktet for genstart af instansen gemmes, så en genstart ikke giver fejlagtige tal.
- Deadlocks hentes fra den eksisterende `system_health`-session, før der oprettes egne Extended Events-sessioner.
- **Repository på en separat instans.** Overvågningsdata bør ikke ligge på den instans, der overvåges. SQL Server Express kan bruges til små installationer, men har en grænse på 10 GB pr. database. Der er derfor en fast retention-politik og aggregering af ældre data.
- **Krypterede forbindelser som standard.** Microsoft.Data.SqlClient bruger `Encrypt=True`. Installeren validerer certifikaterne, og `TrustServerCertificate` kræver et bevidst valg.
- **Findings-sync er opt-in og gennemsigtig.** Kunden kan se præcis, hvad der sendes. Som standard sendes kun fund og metadata, ikke data fra tabellerne. Querytekst kan anonymiseres eller udelades. Forbindelsen er TLS-krypteret og autentificeret med kundens licensnøgle.
- **Hub'en er aldrig en direkte databaseforbindelse.** Agenten taler med et HTTPS-API og aldrig direkte med PostgreSQL.
- **Regler er data med tests.** Hver regel har unit tests med kendte input og forventede fund, så ekspertisen kan udbygges uden regressioner.
- **Opdateringer er signerede og kontrollerede.** Både binære filer og regelpakker er kodesignerede og verificeres, før de installeres. On-prem-kunder vælger selv mellem automatisk opdatering, opdatering efter godkendelse og offline-pakker til air-gapped miljøer. Hver opdatering af databaseskemaet kan rulles tilbage.
- **Build- og CU-katalog er data.** Oversigten over SQL Server-builds, CU'er, support-livscyklus og kendte fejl ligger i regelpakken. Den kan derfor opdateres, uden at der skal frigives en ny version af selve værktøjet.
---
## Roadmap
### Fase 0: Fundament
- [ ] Solution-struktur (.NET 10 LTS): Agent, Rules, Web, Hub, fælles domænemodel
- [ ] CI-pipeline (build, test, statisk analyse)
- [ ] Integrationstests mod rigtige SQL Server-containere (2017, 2019, 2022 og 2025) med Testcontainers. Versionerne 2000–2016 findes ikke som containere og testes på VM'er
- [ ] Least-privilege-script til opsætning af rettigheder og en test, der verificerer det
- [ ] Capability-model: collectors og regler angiver, hvilken minimumsversion, edition og funktion de kræver
- [ ] Spike: forbindelse til SQL Server 2000, 2005 og 2008 (driver, TLS 1.0 og ODBC-fallback). Resultatet afgør, om legacy-laget er et separat modul
- [ ] Testmiljø med VM'er til de legacy-versioner, der ikke findes som containere (2000–2016)
- [ ] Datamodel for findings (fælles kontrakt mellem Agent og Hub)
- [ ] Bidragsguide, code of conduct og issue templates
### Fase 1: Community MVP
- [ ] Agent som Windows Service med forbindelse til en eller flere SQL Server-instanser
- [ ] Collectors: wait stats, blocking, deadlocks (XE), CPU/memory, I/O-latens og konfiguration
- [ ] Regelmotor med de første ~30 regler, som hver har forklaring og anbefaling
- [ ] Lokalt repository med retention-politik
- [ ] Web-UI: serveroversigt, liste over fund, detaljevisning og simple trends
- [ ] Registrering af version og CU-niveau med advarsel om manglende opdateringer
- [ ] Legacy-collectors til 2000/2005/2008: blocking, waits, konfiguration, backup og version
- [ ] MSI-installer og dokumentation
### Fase 2: Dyb analyse
- [ ] Integration med Query Store: regressioner, analyse af planændringer og parameter sniffing
- [ ] Plan cache- og showplan-analyse (implicitte konverteringer, spills, lookups)
- [ ] Index- og statistikanalyse
- [ ] Always On AG, backup/CHECKDB og SQL Agent
- [ ] Baselines og anomali-detektion (hvad er "normalt" for netop denne server?)
- [ ] Notifikationer via e-mail, Teams og webhook
- [ ] Linux-agent (systemd) og understøttelse af Azure SQL Managed Instance
### Fase 3: Kommerciel platform
- [ ] Licensmodel: signerede licensnøgler, der kan verificeres offline
- [ ] Auto-update af værktøj og regelpakker med stable- og preview-kanal
- [ ] Findings-sync fra Agent til Hub API med kø og retry ved netværksfejl
- [ ] SQLInsight Hub med PostgreSQL: modtagelse, deduplikering og historik pr. kunde
- [ ] Hub-portal: overblik over kunder, de mest kritiske fund og tendenser på tværs af kunder
- [ ] Integration med support-flowet: fund kan knyttes til en supportsag
- [ ] Dokumentation til databehandleraftale (GDPR)
### Fase 4: Videre
- [ ] Anbefalinger på tværs af kunder: "denne CU har løst problemet hos andre"
- [ ] Rapporter (PDF) til ledelse og compliance
- [ ] Mulighed for, at community selv bidrager med regler
- [ ] API til integration med eksisterende monitorering (Prometheus, Grafana, SCOM)
---
## Understøttede versioner
SQLInsight Pro overvåger **alle SQL Server-versioner fra SQL Server 2000 og frem**. Ikke alt kan måles på alle versioner. Agenten registrerer derfor, hvad instansen kan (version, edition og funktioner), og vælger de collectors og regler, der passer til den. Hvis en regel ikke kan vurderes på en given version, vises den som **"ikke målbar på denne version"**. Den må aldrig fremstå som "OK".
| Version | Datakilder | Hvad kan analyseres | Begrænsninger |
|---|---|---|---|
| **2000** (8.0) | `sysprocesses`, `DBCC SQLPERF(WAITSTATS)`, `sysindexes`, `sp_configure`, `msdb`, error log | Blocking, waits, konfiguration, backup, filstørrelser og version | Ingen DMV'er og ingen granulære rettigheder. Deadlocks kun via trace flag 1204 i error log. Ingen plananalyse. |
| **2005** (9.0) | DMV'er, default trace | Waits, query stats, plan cache, missing/unused indexes, I/O-latens, blocking-kæder | Ingen Extended Events. Deadlocks via trace flag 1222 og error log. |
| **2008 / 2008 R2** (10.x) | + Extended Events, `system_health` | Deadlock-grafer fra ring buffer og Resource Governor | `system_health` har kun ring buffer. Deadlock-XML er ufuldstændig før 2008 R2. |
| **2012 / 2014** (11–12) | + `system_health` med file target, AlwaysOn-DMV'er | Always On AG, historik over deadlocks, udvidede query-metrikker | |
| **2016** (13) | + Query Store, `LastGoodCheckDbTime` (SP2) | Planregressioner og CHECKDB uden sysadmin | |
| **2017 / 2019** (14–15) | + automatic tuning, `dm_exec_query_plan_stats` | Tilgængelighed af seneste faktiske plan og Linux-instanser | |
| **2022 / 2025** (16–17) | + granulære rettigheder, Query Store hints, PSP optimization | Fuld dækning | |
**Livscyklus:** Alle versioner til og med SQL Server 2016 er uden for Microsofts support (extended support for 2016 sluttede i juli 2026). De bliver overvåget, men versionen vises altid som et **kritisk fund** med en anbefalet opgraderingssti.
**Legacy-forbindelser:** Moderne .NET-drivere og TLS 1.2 er ikke kompatible med de ældste versioner. Uopdaterede 2005/2008-instanser understøtter typisk kun TLS 1.0, og Microsoft.Data.SqlClient understøtter ikke SQL Server 2000. Agenten har derfor et separat forbindelseslag til legacy-versioner (ODBC-baseret), som bruges automatisk ved behov. Kunden får en tydelig advarsel om den svagere kryptering.
**Rettigheder på ældre versioner:** På SQL Server 2000 findes `VIEW SERVER STATE` ikke, så nogle checks kræver forhøjede rettigheder. Det er dokumenteret pr. regel, og kunden vælger selv, hvilke checks der slås til.
Øvrige mål: Standard, Enterprise, Developer og Express edition. Senere kommer Azure SQL Managed Instance.
---
## Bidrag
Projektet er i en tidlig fase. Idéer til regler, eller eksempler på SQL Server-problemer du gerne vil have værktøjet til at fange, er meget velkomne som issues.
## Licens
[MIT](LICENSE)