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:
Typische Struktur:
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:
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.
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.