# Har holdt skemaet ærligt på tværs af 1.022 migrationer med en CI‑gate, der bygger databasen begge veje — en frisk installation og en installation plus hver eneste migration — og fejler, når de to ikke stemmer overens.

2025

**Situation.** Et skema er beskrevet to gange i de fleste projekter: én gang af den indledende opsætning, der bygger det fra bunden, og én gang af de ophobede migrationer, der har fået det til at vokse. Begge er ment at producere den samme database. Intet tjekker, at de gør det, så de driver fra hinanden — og afdriften er usynlig, indtil et friskt miljø opfører sig anderledes end produktion, som regel på det værst tænkelige tidspunkt.

**Opgave.** De to beskrivelser skulle beviseligt være identiske, automatisk, frem for periodisk at blive troet at være det.

**Handling.** Databasen er versioneret som 1.022 migrationer, nummereret fra 036 til 1102, og rækkefølgedisciplinen omkring dem er kedelig og ikke til forhandling. Det, der får den til at holde, er et CI‑job, der bygger databasen to gange ved hver ændring: én gang fra det friske initielle skema, én gang fra det initielle skema plus hver eneste migration afspillet i rækkefølge — og så sammenligner de to. Ikke bare strukturen, som er den nemme halvdel, men også de seedede data, for en migration, der backfiller en opslagstabel forkert, er præcis lige så skadelig som en, der glemmer en kolonne, og kun den ene af dem dukker op i en skema‑diff. Enhver uenighed får buildet til at fejle med forskellen printet ud.

**Resultat.** Et friskt miljø og et langtlevende er den samme database, og det bliver tjekket frem for antaget. Omkostningen lander hos den, der skriver en migration: den skal virke afspillet, og den skal virke fra koldt, hvilket er mere tanke, end et hurtigt ALTER som regel får. Det er netop pointen — alternativet er at finde ud af det under en gendannelse, hvor svaret betyder noget, og der ikke er tid til at regne det ud.

---

- Rolle: Databaseingeniør
- Kategorier: [Databaser](https://engineer.company/da/categories/databases/), [PostgreSQL](https://engineer.company/da/categories/postgresql/), [Data governance](https://engineer.company/da/categories/data-governance/), [DevOps](https://engineer.company/da/categories/devops/), [Drift & backup](https://engineer.company/da/categories/reliability/), [Migrering & modernisering](https://engineer.company/da/categories/migration/), [Test & QA](https://engineer.company/da/categories/testing/)
- Ydelser: [Databaseadministration (DBA)](https://engineer.company/da/services/database-administration/), [Databasemigrering & modernisering](https://engineer.company/da/services/database-migration/), [DevOps & CI/CD‑automatisering](https://engineer.company/da/services/devops-cicd/)

<https://engineer.company/da/portfolio/kept-the-schema-honest-across-1022-migrations-99/>
