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 ST
ART HIDDEN
constraint DF_ValidFrom DEFAULT DAT
EADD(SECOND, -1, SYS
UTCDATETIME())
, 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 (SYSTEM
VERSIONING = 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 (SYSTEM
VERSIONING = 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.