top of page

Änderungsverfolgung / Change Tracking

(alle Versionen ab SQL 2008 /all versions since SQL 2008)

Donnerstag, 16. Januar 2025

Deutsch

Hintergrund

Schritte für Aktivierung

Abfragen von Änderungen

Nachteile



Deutsch


Hintergrund

Microsoft SQL-Server bietet ab Version 2008 die sogenannte "Änderungsverfolgung" bzw. "Change Tracking" an.

Diese erlaubt es , pro Zeile einer Tabelle zu erkennen , was zeilenweise geändert wurde (Neuanlage, Update, Löschung).


Es ist nicht möglich , für einzelne Datenfelder bzw. Datenspalten einen Inhaltsvergleich vorher/nachher abzufragen.

Anmerkung: Die Änderungsverfolgung liefert lediglich Metadaten über geänderte Spalten, sofern die Option TRACK_COLUMNS_UPDATED = ON aktiviert ist, jedoch ohne die alten und neuen Werte bereitzustellen.


Die Änderungsverfolgung ist nicht für eine dauerhafte Überwachung oder Protokollierung von inhaltlichen Änderungen auf Feldebene konzipiert. Für detaillierte Änderungsprotokolle (einschließlich vorheriger und aktueller Werte) ist Change Data Capture (CDC) oder eine alternative Lösung erforderlich, da diese Funktionalität nicht im Fokus der Änderungsverfolgung steht.


Tipp: Für weitere Optionen einer Änderungsverfolgung siehe nachfolgende Übersicht: https://www.officium-inservio.com/ms-sql/changetrackingoverview

Schritte für Aktivierung

Die Änderungsverfolgung muss zuerst für die gesamte Datenbank aktiviert werden.


Beispiel T-SQL:

ALTER DATABASE [DbName] SET CHANGE_TRACKING = ON  (CHANGE_RETENTION = 7 DAYS, AUTO_CLEANUP = ON);

⚠️ Es ist zu beachten , dass sich hohe CHANGE_RETENTION-Vorgaben negativ auf die Datenbank auswirken können, da die Änderungsverfolgungsmetadaten dann konsequenterweise länger aufbewahrt werden und dadurch den Speicherbedarf und die Abfrageleistung belasten können. Daher wird empfohlen, die Retentionszeit an die Anforderungen des Synchronisationszyklus anzupassen und sehr lange Aufbewahrungszeiten zu vermeiden.

Die Änderungsverfolgung ist nicht für eine dauerhafte Überwachung oder Protokollierung von inhaltlichen Änderungen auf Feldebene konzipiert (siehe Hinweise weiter oben).


Aktivierung für SQL-Tabelle, T-SQL-Beispiel:

ALTER TABLE [dbo].[KHKArtikel]
ENABLE CHANGE_TRACKING  
WITH (TRACK_COLUMNS_UPDATED = ON);

Abfragen von Änderungen

Nachfolgendes T-SQL-Script zeigt eine Übersicht aller Tabellen , für die die Änderungsverfolgung aktiviert wurde.

SELECT     sch.name AS SchemaName,    tbl.name AS TableName,    tbl.object_id AS TableObjectID,    ct.is_track_columns_updated_on AS TrackColumnsUpdated,    ct.change_tracking_min_valid_version AS MinValidVersion FROM    sys.change_tracking_tables ct INNER JOIN      sys.tables tbl ON ct.object_id = tbl.object_id INNER JOIN      sys.schemas sch ON tbl.schema_id = sch.schema_id ORDER BY      SchemaName, TableName;

Mit folgender T-SQL kann z.B. ein Vergleich zu einer vorherigen Protokollversion für eine bestimmte SQL-Tabelle erfolgen.

DECLARE @LastSyncVersion BIGINT = 0; 

SELECT @LastSyncVersion = CHANGE_TRACKING_CURRENT_VERSION() - 1;

SELECT @LastSyncVersion

SELECT CT.SYS_CHANGE_VERSION AS ChangeVersion,
CT.SYS_CHANGE_CREATION_VERSION AS CreationVersion,
CT.SYS_CHANGE_OPERATION AS ChangeOperation,
CT.SYS_CHANGE_COLUMNS AS ChangedColumns,
CT.SYS_CHANGE_CONTEXT AS ChangeContext
, A.*
FROM 
CHANGETABLE(CHANGES dbo.KHKArtikel, @LastSyncVersion) AS CT
LEFT JOIN 
dbo.KHKArtikel AS A ON CT.[Mandant] = A.[Mandant] AND CT.[Artikelnummer] = A.[Artikelnummer];

Nachteile


Es ist keine Änderungsverfolgung auf Feld-Ebene mit der Standard-Änderungsverfolgung möglich. Die Änderungsverfolgung ist nicht für eine dauerhafte Überwachung oder Protokollierung von inhaltlichen Änderungen auf Feldebene konzipiert. Siehe Hinweise weiter oben.


Der SQL-Server muss für die Änderungsverfolgung generell mehr Metadaten speichern , um die Änderungen zu verfolgen.

Bei großen Tabellen mit häufigen Änderungen bedeutet das mehr Platzbedarf und höhere I/O-Last.

Auch die CPU-Auslastung steigt!


⚠️Vor umfangreichen Updates einer Datenbank , die Strukturänderungen implizieren , sollte man die Änderungsverfolgung ggf. temporär ausschalten , um Folgefehler im Rahmen einer Strukturänderung zu vermeiden.

Nach durchgeführter struktureller Änderung der Datenbank kann man die Änderungsverfolgung dann wieder aktivieren.


⚠️Am bedeutsamsten ist , dass durch die Änderungsverfolgung u.U. Transaktionszeiten spürbar verlängert werden.

Je nach Anwendungsfall der Datenbank kann dies erhebliche Nachteile oder sogar Fehler beim Programmablauf bedeuten.


Konkretes Beispiel im Umfeld des Sage 100 ERP-Systems:


Sage testet die Anwendung nicht mit einer aktivierten Änderungsverfolgung.

Man sollte nicht bei Sage 100 ERP-Tabellen , die für Transaktionen relevant sind (Lager, Belege, Buchungen) ungeprüft irgendeine Änderungsverfolgung am SQL-Server aktivieren!

Aus Sicht der Sage 100 macht dies nicht wirklich Sinn.

Abgesehen von möglichen Transaktionsproblemen:

Es gibt bereits im Sage 100 Standard z.B. ein Lagerprotokoll , die Beleg-Archiv-Tabellen und im Rechnungswesen ein Buchungsjournal etc.


⚠️Im Rahmen der üblichen Datenbank-Updates , durch das Sage Administrator-Tool , sollte man die Änderungsverfolgung vor Aktualisierung im Sage Administrator Tool ausschalten.

Dieses Tool arbeitet transaktionsbasiert und bei aktivierter Änderungsverfolgung kann es u.U. zu den o.g. Problemen kommen.






bottom of page