Es handelt sich dabei um eine aus meiner Sicht sehr nützliche Erweiterung des SQL Server 2016. Hiermit ist ohne größeren Aufwand eine Versionierung und Historisierung der Daten möglich.
ALTER TABLE dbo.Orders
ADD SysStartTime datetime2 GENERATED ALWAYS AS ROW START
CONSTRAINT P_ValidFromConstraint DEFAULT SYSUTCDATETIME() NOT NULL,
SysEndTime datetime2 GENERATED ALWAYS AS ROW END
CONSTRAINT P_ValidToConstraint DEFAULT CONVERT (DATETIME2, '9999-12-31 23:59:59.9999999') NOT NULL,
PERIOD FOR SYSTEM_TIME (SysStartTime, SysEndTime)
GO
ALTER TABLE dbo.Orders
SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.Orders_History))
GO
Der Tabelle wird ein Start- und Enddatum hinzugefügt und die System-Versionierung muss eingeschaltet werden. Danach wird automatisch bei jeder Änderung ein Historiendatensatz anlegt.
Ein großer Vorteil ist hier auch, dass man über die Originaltabelle Abfrage des Datenstandes zu einem bestimmten Zeitpunkt machen kann, ohne selbst die History-Tabelle zu durchsuchen.
WHERE orderID = 10248
Allerdings sollte man hier immer ein Auge auf die Datenmenge haben, da diese Art der Versionierung bei häufigen Änderungen der Daten und evtl. auch noch sehr großen Datenmengen je Datenzeile sehr viel Platz benötigt.
Trigger | In die Historie Tabelle kommt das rein, was geändert wurde. Das bedeutet Datenmanipulationen innerhalb des Trigger Aufrufs werden in der Historie Tabelle nicht wiedergespiegelt. |
Schemaänderungen | Solange keine Historie Eintrage gemacht wurden, ist das Löschen, Hinzufügen oder Ändern von Spalten uneingeschränkt möglich. Sobald Daten vorhanden sind, funktioniert nur noch das Löschen einer Spalte. Dabei wird die Spalte nicht nur aus der Originaltabelle, sondern auch aus der Historie Tabelle mit allen Daten entfernt. |
Index | Um eine Indexierung der Historie Tabelle muss und sollte man sich dann auch selbst kümmern. CREATE CLUSTERED COLUMNSTORE INDEX IX_OrdersHistory |
Wer schon mal selbst eine Historisierung bauen musste, weiß sicher genau, wie aufwendig sowas werden kann. Deshalb halte ich diese Erweiterung des SQL Server 2016 für eine der Nützlichsten. Solange man den Plattenplatz im Auge behält oder am Anfang entsprechend mit plant, kann man mit den temporalen Tabellen eine ganze Menge Entwicklungszeit einsparen.