ProgrammierungDatenbankentwickler

Wie implementiert man Protokolltabellen (Log-Tabellen) richtig zur Überwachung von Änderungen in Produktions-SQL-Datenbanken? Welche Fallstricke gibt es und wie kann man ihren Einfluss auf die Leistung minimieren?

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort.

Protokolltabellen für Änderungen (Log/Audit-Tabellen) sind normale Tabellen, in denen Ereignisse zur Änderung von Daten in Produktionstabellen gespeichert werden: wer, wann und was geändert hat. Relevant für den Finanzsektor, E-Commerce, und staatliche Institutionen.

Implementierungsansätze:

  1. Explizite Protokollierung über die Anwendung oder Prozedur.
  2. Verwendung von Triggern zur Überwachung jeglicher Änderungen.
  3. In neuen DBMS – systemische Mechanismen für Change Data Capture (CDC) oder Temporale Tabellen.

Typische Struktur:

  • audit_id (PK), TableName, OperationType (I/U/D), RecordID, OldValue, NewValue, ChangedBy, ChangeDT

Beispielcode (Trigger für Audit UPDATE)

CREATE TABLE ProductAudit ( AuditID int IDENTITY(1,1) PRIMARY KEY, ProductID int, OldPrice money, NewPrice money, ChangedBy sysname, ChangeDT datetime, OperationType char(1) ); GO CREATE TRIGGER trg_ProductAudit ON Products AFTER UPDATE AS BEGIN INSERT INTO ProductAudit(ProductID, OldPrice, NewPrice, ChangedBy, ChangeDT, OperationType) SELECT d.ProductID, d.Price, i.Price, SYSTEM_USER, GETDATE(), 'U' FROM inserted i JOIN deleted d ON i.ProductID = d.ProductID WHERE i.Price <> d.Price; END

Fallstricke:

  • Eine große Audit-Tabelle kann die Abfragen verlangsamen.
  • Es ist eine ordnungsgemäße Partitionierung/Entfernung alter Daten erforderlich.
  • Man muss auf Sperren und Duplikation von Änderungen achten.

Fangfrage.

F: Wird der in die Log-Tabelle eingefügte Eintrag automatisch bei einer Rückgängigmachung der Haupttransaktion zurückgesetzt?

A: Wenn der Trigger Teil der Transaktion ist, dann ja, der Eintrag im Protokoll wird zusammen mit der Hauptoperation zurückgesetzt. Bei der Protokollierung auf Anwendungsebene oder in einer separaten Transaktion kann jedoch die Konsistenz fehlen.

Beispiele für reale Fehler aufgrund mangelnden Wissens über die Feinheiten des Themas.


Geschichte

In einer Kreditinstitution wurde der Mechanismus zur Bereinigung der Audit-Tabelle nicht implementiert. Das Volumen überstieg mehrere hundert Millionen Zeilen, was zu langen Backups, Platzmangel und einer Leistungsminderung der gesamten DB führte.


Geschichte

Der Entwickler führte das Audit über eine separate Verbindung außerhalb der Transaktion durch. Infolgedessen erschienen Einträge über Ereignisse, die nicht existierten (die Transaktion der Anwendungslogik wurde zurückgesetzt, aber der Eintrag im Log nicht).


Geschichte

Bei der Gestaltung der Log-Tabelle für Änderungen wurden allen Feldern der Typ NVARCHAR(MAX) für Universalität zugewiesen. Dies war nicht erforderlich und belastete nur die Speicherung und Indizierung — Daten konnten nicht effektiv analysiert werden.