Wenn Du Daten wegwirfst, wirfst Du Wissen weg

Viele Systeme speichern nur den aktuellen Stand. Änderungen? Überschrieben. Gelöscht. Vergessen.

Und dann fragt der Chef:
„Was stand da eigentlich vor sechs Monaten?“
Tja.

Wenn Du kein Archiv hast, kannst Du nichts beantworten.

Warum Archivierung wichtig ist

  • Nachvollziehbarkeit bei StreitfĂ€llen
  • Historie fĂŒr Analysen (Trends, Entwicklung)
  • Beweissicherung (z. B. bei VertrĂ€gen)
  • Entlastung des Produktivsystems
  • Dokumentation von ZustandsĂ€nderungen

Strategien fĂŒr ein Datenarchiv

  • Historische Tabelle per Trigger fĂŒllen
  • Periodisches Auslagern (z. B. monatlich)
  • Temporale Tabellen (ab SQL Server 2016)
  • Change Data Capture (CDC) oder eigene Änderungslogik
  • VollstĂ€ndige Snapshots bei bestimmten Events

Beispiel 1: Trigger-Archiv fĂŒr Änderungen

CREATE TABLE Kunden_Archiv (
    ArchivID INT IDENTITY(1,1) PRIMARY KEY,
    KundenID INT,
    Name NVARCHAR(100),
    Adresse NVARCHAR(200),
    Änderungsdatum DATETIME DEFAULT GETDATE(),
    Aktion CHAR(1) -- I = Insert, U = Update, D = Delete
);
CREATE TRIGGER trg_Kunden_Archiv
ON Kunden
AFTER INSERT, UPDATE, DELETE
AS
BEGIN
    SET NOCOUNT ON;

    -- Insert
    INSERT INTO Kunden_Archiv (KundenID, Name, Adresse, Aktion)
    SELECT KundenID, Name, Adresse, 'I'
    FROM inserted
    WHERE NOT EXISTS (SELECT * FROM deleted WHERE deleted.KundenID = inserted.KundenID);

    -- Update
    INSERT INTO Kunden_Archiv (KundenID, Name, Adresse, Aktion)
    SELECT KundenID, Name, Adresse, 'U'
    FROM inserted
    INNER JOIN deleted ON inserted.KundenID = deleted.KundenID;

    -- Delete
    INSERT INTO Kunden_Archiv (KundenID, Name, Adresse, Aktion)
    SELECT KundenID, Name, Adresse, 'D'
    FROM deleted;
END;

Du sicherst jede Änderung mit. Minimalistisch. Robust. FĂŒr kleine Tabellen reicht das.

Beispiel 2: Temporale Tabellen (ab SQL Server 2016)

CREATE TABLE Artikel (
    ArtikelID INT PRIMARY KEY,
    Name NVARCHAR(100),
    Preis DECIMAL(10,2),
    GĂŒltigVon DATETIME2 GENERATED ALWAYS AS ROW START,
    GĂŒltigBis DATETIME2 GENERATED ALWAYS AS ROW END,
    PERIOD FOR SYSTEM_TIME (GĂŒltigVon, GĂŒltigBis)
)  
WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.Artikel_Historie));

SQL Server fĂŒhrt automatisch Buch ĂŒber Änderungen. Du kannst spĂ€ter bequem zurĂŒckblicken:

SELECT *
FROM Artikel
FOR SYSTEM_TIME AS OF '2023-01-01 00:00:00'
WHERE ArtikelID = 123;

Klingt nach Magie. Ist einfach gut gemacht.

Beispiel 3: Snapshot bei Periodenwechsel

Du brauchst keine lĂŒckenlose Historie? Dann reichen Snapshots.

SELECT *
INTO Archiv_Bestand_2024_01
FROM Lagerbestand
WHERE Standort = 'Zentral';

Das kannst Du automatisieren – z. B. per SQL-Agent-Job oder PowerShell.

Archivierte Daten nutzbar machen

Ein Archiv bringt nur was, wenn Du’s auch auswerten kannst.

  • Einheitliche Formate (gleiche Spalten wie Original)
  • Zeitbezug immer mit erfassen
  • Views zur einfachen Abfrage
  • Power BI oder Excel-Anbindung

Beispiel fĂŒr eine konsolidierte Sicht:

CREATE VIEW vKunden_Chronik AS
SELECT KundenID, Name, Adresse, Änderungsdatum, Aktion
FROM Kunden_Archiv
UNION ALL
SELECT KundenID, Name, Adresse, NULL AS Änderungsdatum, 'C' AS Aktion
FROM Kunden;

Jetzt kannst Du jederzeit sehen, was sich wann geĂ€ndert hat – oder eben nicht.

Tabelle: Was eignet sich wann?

MethodeVorteilNachteil
TriggerFlexibel, individuellPflegeaufwand, FehleranfÀllig
Temporale TabellenIntegriert, sauberNur ab SQL 2016, nicht fĂŒr alles
SnapshotsSchnell, einfachLĂŒckenhaft, keine Änderungsdetails
CDC / Log ShippingVollstÀndig, systemnahKomplex, nicht auswertbar ohne Tools

Also

Ich bau Architekturen so, dass ich auch noch in 3 Jahren nachvollziehen kann, warum etwas passiert ist.

Du auch?

Dann bau Dir ein Archiv. Und zwar nicht erst, wenn das erste Gerichtsschreiben kommt.

Tags:

No responses yet

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert