sqlinsight-pro/CONTRIBUTING.md
Claude 7f640e74e5
Some checks are pending
CI / Build og unit tests (push) Waiting to run
CI / Integration (mcr.microsoft.com/mssql/server:2017-latest) (push) Blocked by required conditions
CI / Integration (mcr.microsoft.com/mssql/server:2019-latest) (push) Blocked by required conditions
CI / Integration (mcr.microsoft.com/mssql/server:2022-latest) (push) Blocked by required conditions
CI / Integration (mcr.microsoft.com/mssql/server:2025-latest) (push) Blocked by required conditions
Fase 4: community and local rules written as SQL
Rules can now be data: a JSON file with one read-only SELECT where every
row is a finding, with {column} templates, server or per-database scope,
minimum version, sensitive columns and references. Community rules live
in rules/community (reviewed via pull request), ship with every build
and with the signed rule pack; local rules are read from the agent's
data folder every five minutes. Queries are checked for anything that
could write, run with the least-privilege login, and a missing
permission makes the rule not measurable rather than failing. The
rule engine picks up catalog changes without a restart. Authors get
'rules validate' and 'rules test --instance'. Four example community
rules (sa active, orphaned database owners, default trace off,
untrusted foreign keys).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E3EExwndy8Z22EK2Qpt6BK
2026-09-29 10:23:01 +00:00

53 lines
2.9 KiB
Markdown

# Bidrag til SQLInsight Pro
Tak fordi du vil hjælpe. De mest værdifulde bidrag er **SQL Server-ekspertise**: problemer du har set i produktion, hvordan de måles, og hvordan de løses. Opret dem som et issue med skabelonen *Forslag til regel*.
## Byg og test
Du skal bruge [.NET 10 SDK](https://dotnet.microsoft.com/download) og, til integrationstests, Docker.
```bash
dotnet build
dotnet test --filter "Category!=Integration" # unit tests, ingen afhængigheder
dotnet test tests/SQLInsight.IntegrationTests # starter SQL Server 2022 i Docker
SQLINSIGHT_MSSQL_IMAGE=mcr.microsoft.com/mssql/server:2019-latest \
dotnet test tests/SQLInsight.IntegrationTests # anden version
```
Warnings behandles som fejl, og .NET-analyzers kører på niveauet `latest-recommended`.
## Struktur
| Mappe | Indhold |
|---|---|
| `src/SQLInsight.Core` | Domænemodel: versioner, capabilities, findings |
| `src/SQLInsight.Connectivity` | Forbindelser (SqlClient + ODBC-fallback) og registrering af instansen |
| `src/SQLInsight.Rules` | Regelmotor og regler |
| `src/SQLInsight.Agent` | Windows Service / systemd-agent |
| `src/SQLInsight.Web` | On-prem web-UI (Fase 1) |
| `src/SQLInsight.Contracts` | Wire-kontrakt mellem agent og Hub |
| `src/SQLInsight.Hub` | Centralt API til findings, PostgreSQL (Fase 3) |
| `db/permissions` | Least-privilege-script til agentens login |
| `tests/` | Unit og integrationstests |
## Sådan skriver du en regel
1. Implementér `IRule` i `src/SQLInsight.Rules`. Giv den et nyt, fast id (`SQLI-<OMRÅDE>-<NR>`). Et id genbruges aldrig.
2. Angiv i `RequiredCapabilities` alt, hvad reglen kræver. Motoren rapporterer den som *ikke målbar* på versioner, der mangler noget. Reglen må aldrig selv returnere `Passed`, når den ikke har kunnet måle.
3. Et finding skal have **evidens** (de konkrete tal), **forklaring** (hvorfor det er et problem) og **anbefaling** (hvad man gør). Fix-scripts vises for brugeren og køres aldrig automatisk.
4. Skriv unit tests for alle udfald: fundet, ikke fundet, grænseværdier og versioner, hvor reglen ikke kan måles.
5. Registrér reglen i `BuiltInRules`.
### Uden C#: community-regler
Mange regler kan skrives som en SQL-forespørgsel i en JSON-fil under `rules/community/`. De kræver ingen C# og kan afprøves direkte mod en instans med `SQLInsight.Agent rules test`. Se [docs/regler.md](docs/regler.md).
## Queries mod overvågede servere
- De skal være **read-only** og kunne køre med rettighederne fra `db/permissions/grant-least-privilege.sql`. Kræver de mere, skal scriptet og `LeastPrivilegeTests` opdateres i samme ændring.
- De skal være billige: ingen `DETAILED`-scans, grænser på antal rækker og intet, der kan tage låse på brugerdata.
- Tjek, hvilke versioner DMV'en og kolonnerne findes i, og angiv det som capabilities.
## Commits
Små, fokuserede commits med en besked, der forklarer *hvorfor*.