System-Versioned Table

Eintrag zuletzt aktualisiert am: 18.10.2017

Mit SQL Server 2016 hatte Microsoft den Tabellentyp der "temporalen Tabellen" (alias "System-Versioned Tables") eingeführt, bei denen der SQL Server 2016 automatisch alle früheren Inhalte einer Tabelle in einer Historientabelle speichert. Eine normale SQL-Abfrage liefert immer den letzten Zustand, mit speziellen Abfragen kommt der Nutzer an alte Versionen.

Beispiel: Erweitern der Tabelle "Kunde" zur temporalen Tabelle

ALTER TABLE Kunden
ADD
ValidFrom datetime2 (0) GENERATED ALWAYS AS ROW START HIDDEN
constraint DF_ValidFrom DEFAULT DATEADD(SECOND, -1, SYSUTCDATETIME())
, ValidTo datetime2 (0) GENERATED ALWAYS AS ROW END HIDDEN
constraint DF_ValidTo DEFAULT '9999.12.31 23:59:59.99'
, PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo);

ALTER TABLE Kunden
SET (SYSTEMVERSIONING = ON (HISTORYTABLE = dbo.KundenHistory);
GO

Aufbewahrungszeit (ab SQL Server 2017)

Ein Problem in der Praxis ist, dass der SQL Server bei der bisherigen Implementierung die veralteten Datensätze für immer aufbewahrt, sofern der Nutzer diese nicht manuell bzw. per Job löscht (vgl. [https://www.mssqltips.com/sqlservertip/4674/managing-temporal-table-history-in-sql-server-2016/].) Neu in der Version 2017 sind Aufbewahrungsrichtlinien (Retention Policies), mit denen man eine automatische Löschung nach n Tagen, Wochen, Monaten oder Jahren festlegen kann. Der folgende Befehl legt für die Datensätze der versionierten Tabelle "Kunde" eine Aufbewahrungsdauer von 14 Tagen fest:

ALTER TABLE Kunde
SET (SYSTEMVERSIONING = ON (HISTORY_TABLE = dbo.KundenHistory, HISTORY_RETENTIONPERIOD = 14 DAYS));
GO

Es ist aber weiterhin nicht möglich, anstelle der Aufbewahrungszeit die Aufbewahrung auf eine bestimmte Anzahl von Versionen zu beschränken.