Samenvatting
Een Nederlandse vakbond haalde administratie- en financiele data tot voor kort binnen via een maandelijkse databaserestore, met weken vertraging. Daar is een dagelijkse feed naast gezet die twee datastromen rechtstreeks via de REST-API van het bronsysteem ophaalt. De data loopt via een stage-laag naar system-versioned temporal tables, waarna een MERGE alleen bij echte wijzigingen historie wegschrijft en verwijderde regels netjes uitfaseert. Het resultaat landt in de BI-laag waarop Power BI-rapportages draaien, met een koppeling tussen begroting en realisatie per periode.
De vraag
Financiele en administratiedata uit het bronsysteem sneller en betrouwbaarder beschikbaar krijgen voor rapportage, zonder de bestaande vertraagde restore meteen stil te leggen. Daarnaast een tweede feed die begrotingscijfers aan de realisatie koppelt.
Wat ik heb gebouwd
- Twee Python-pipelines (administratieregels en begroting) die dezelfde REST-API met Bearer-token per jaar bevragen
- Sterk getypeerde transformatie van de ruwe JSON (datums, bedragen, booleans, id's) voordat de data de database in gaat
- Een stage-laag (bulk-insert, fast_executemany) gevolgd door een dedup- en MERGE-stap naar temporal tables, met delete-missing gescoped op de opgehaalde jaren zodat oudere historie niet verdwijnt
- Stage-vulling en de MERGE-procedure in één database-transactie, met rollback zodra er iets misgaat
- Integratie in de bestaande nightly SQL Agent-job, met logging van start, eind en rijaantallen
- Een BI-laag die begroting en realisatie aan elkaar koppelt, zodat beide naast elkaar in een rapport bruikbaar zijn
In detail
- Volledige historie: elke wijziging blijft traceerbaar via temporal tables, ook na verwijdering uit de actuele data
- Idempotent: een herhaalde run zonder brondata-wijziging voegt geen nieuwe historie toe
- Transactionele consistentie: bij een fout in de merge-stap wordt de hele run teruggedraaid, geen halve stand in de database
- Configureerbare periode: welke jaren worden opgehaald is instelbaar, met een aparte default voor de begrotingsfeed omdat begrotingen vooruit worden vastgesteld
- Los inzetbaar naast de oude, langzamere datastroom, zodat er niets acuut hoefde te worden stilgelegd
Resultaat
In productie en dagelijks in gebruik als vaste stap in de nachtelijke verwerking; de begrotingsfeed voedt een rapportage waarin budget en realisatie per periode naast elkaar staan.