eBizTalk - Berichten, Unterhalten, Weiterbilden
Ob Branchendiskurs, Fachartikel oder ein Blick hinter die Unternehmenskulissen: eBizTalk ist die Plattform, die uns auffordert, unsere Leser über Events und Projekte auf dem Laufenden zu halten. Und uns gegenseitig natürlich auch.

SQL Server 2016 - Improvements: Temporale Tabellen

Veröffentlicht am 04.08.2017 von Ireen Raue , SQL Server , Custom Development , Data

Am 06.12.2017 und 07.12.2017 fand in Darmstadt die TechSummit von Microsoft statt. Wie auch letztes Jahr, waren wir wieder mit einigen Kollegen vor Ort. In diesem Jahr gab es allerdings im Gegensatz zum letzten Jahr deutlich weniger SQL Server Sessions. Eine davon beschäftigte sich mit den temporalen Tabellen, ein neues Feature des SQL Server 2016, das ich bereits kurz bei den SQL Days in Leipzig kennengelernt habe.

Temporale Tabellen

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.

clip_image002[7]

Code Snippet

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.


Code Snippet

SELECT * FROM dbo.Orders FOR SYSTEM_TIME AS OF '2016-10-27 15:47:00.3823880'

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.

Einige Einschränkungen:

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
ON dbo.OrdersHistory
WITH (DROP_EXISTING = ON);

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.

google_about_ebiz fb_about_ebiztwitter_about_ebizxing_about_ebiz
ebiz_consulting_expertise