MariaDB Server 10.3 kommt mit einer neuen, sehr nützlichen Funktion, die das Design vieler Anwendungen vereinfachen wird. Die Datenversionierung ist aus mehreren Perspektiven wichtig. Die Konformität erfordert möglicherweise, dass Sie Datenänderungen speichern müssen. Für analytische Abfragen möchten Sie möglicherweise Daten zu einem bestimmten Zeitpunkt einsehen, und für Auditzwecke ist es wichtig, welche Änderungen vorgenommen wurden und wann. Auch wenn eine Tabelle gelöscht wird, kann es von großem Wert sein, sie aus dem Verlauf wiederherzustellen. MariaDB Server enthält jetzt eine Funktion namens System-Versioned Tables, die auf der Spezifikation im SQL:2011-Standard basiert. Es bietet eine automatische Versionierung von Tabellendaten.
Ich werde das Konzept der systemversionierten Tabellen anhand eines sehr einfachen Beispiels durchgehen, das Ihnen zeigen wird, worum es geht. Beginnen wir mit dem Erstellen einer Datenbank und einer Tabelle.
CREATE DATABASE Company;
CREATE TABLE Person (
Id int(11) NOT NULL AUTO_INCREMENT,
FirstName varchar(50) NOT NULL,
LastName varchar(50) NOT NULL,
Gender char(1) NOT NULL,
DepartmentId int(11) NOT NULL,
PRIMARY KEY (Id),
CONSTRAINT con_gender CHECK (Gender in ('f','m')))
WITH SYSTEM VERSIONING;
Es sieht genauso aus wie zuvor, außer der letzten Tabellenoption WITH SYSTEM_VERSIONING, die die automatische Versionierung der Tabelle einschaltet. Lassen Sie uns sehen, wie es funktioniert, indem Sie eine Zeile in die Tabelle einfügen.
MariaDB [Company]> INSERT INTO Person (FirstName, LastName, Gender, DepartmentId) VALUES ('Rasmus', 'Johansson', 'm', 1);
Query OK, 1 row affected (0.002 sec)
MariaDB [Company]> SELECT * FROM Person;
+----+-----------+-----------+--------+--------------+
| Id | FirstName | LastName | Gender | DepartmentId |
+----+-----------+-----------+--------+--------------+
| 1 | Rasmus | Johansson | m | 1 |
+----+-----------+-----------+--------+--------------+
1 row in set (0.001 sec)
Dort haben wir mich als eine Zeile in einer Tabelle. Der interessante Teil beginnt, wenn wir Zeilen aktualisieren. Ich werde die Abteilung ein paar Mal wechseln.
MariaDB [Company]> UPDATE Person SET DepartmentId = 2 WHERE Id = 1; Query OK, 1 row affected (0.002 sec)
Rows matched: 1 Changed: 1 Inserted: 1 Warnings: 0
MariaDB [Company]> SELECT * FROM Person;
+----+-----------+-----------+--------+--------------+
| Id | FirstName | LastName | Gender | DepartmentId |
+----+-----------+-----------+--------+--------------+
| 1 | Rasmus | Johansson | m | 2 |
+----+-----------+-----------+--------+--------------+
1 row in set (0.001 sec)
MariaDB [Company]> UPDATE Person SET DepartmentId = 3 WHERE Id = 1;
Query OK, 1 row affected (0.003 sec)
Rows matched: 1 Changed: 1 Inserted: 1 Warnings: 0
MariaDB [Company]> SELECT * FROM Person;
+----+-----------+-----------+--------+--------------+
| Id | FirstName | LastName | Gender | DepartmentId |
+----+-----------+-----------+--------+--------------+
| 1 | Rasmus | Johansson | m | 3 |
+----+-----------+-----------+--------+--------------+
1 row in set (0.001 sec)
Wie Sie sehen können, teilt MariaDB Server mit, dass für jedes Update wie üblich 1 geänderte Zeile, aber auch 1 eingefügt wird, was bei einer Tabelle ohne Versionierung nicht der Fall wäre. Jede Aktualisierung bewirkt eine neue Version der Zeile, die in die Tabelle eingefügt werden muss. Wie Sie auch oben sehen, zeigt ein normales SELECT nur die neueste Version. Um alle Versionen der Zeilen anzuzeigen, bietet MariaDB Server die folgende Syntax.
MariaDB [Company]> SELECT * FROM Person FOR SYSTEM_TIME ALL;
+----+-----------+-----------+--------+--------------+
| Id | FirstName | LastName | Gender | DepartmentId |
+----+-----------+-----------+--------+--------------+
| 1 | Rasmus | Johansson | m | 1 |
| 1 | Rasmus | Johansson | m | 2 |
| 1 | Rasmus | Johansson | m | 3 |
+----+-----------+-----------+--------+--------------+
3 rows in set (0.001 sec)
Um sehen zu können, wann die Zeilen aktualisiert wurden, wollen wir zwei unsichtbare Spalten einbinden, die durch die automatische Versionierung erstellt werden. Unsichtbare Spalten ist ein weiteres aufregendes neues Feature von MariaDB Server 10.3. Die unsichtbaren Spalten der automatischen Versionierung sind ROW_START und ROW_END. Sie definieren den Zeitraum, für den die Version der Zeile gültig war/ist.
MariaDB [Company]> SELECT *, ROW_START, ROW_END FROM Person FOR SYSTEM_TIME ALL;
+----+-----------+-----------+--------+--------------+----------------------------+----------------------------+
| Id | FirstName | LastName | Gender | DepartmentId | ROW_START | ROW_END |
+----+-----------+-----------+--------+--------------+----------------------------+----------------------------+
| 1 | Rasmus | Johansson | m | 1 | 2018-05-03 07:21:12.386980 | 2018-05-03 07:22:29.188266 |
| 1 | Rasmus | Johansson | m | 2 | 2018-05-03 07:22:29.188266 | 2018-05-03 07:22:47.596481 |
| 1 | Rasmus | Johansson | m | 3 | 2018-05-03 07:22:47.596481 | 2038-01-19 03:14:07.999999 |
+----+-----------+-----------+--------+--------------+----------------------------+----------------------------+
3 rows in set (0.000 sec)
Das Interessante ist jetzt, Point-in-Time-Abfragen durchzuführen, um genau abzurufen, wie die Tabelle zu einem bestimmten Datum und zu einer bestimmten Uhrzeit aussah. Wir können dies tun, indem wir die AS OF-Syntax verwenden:
MariaDB [Company]> SELECT * FROM Person FOR SYSTEM_TIME AS OF TIMESTAMP '2018-05-03 07:22:33';
+----+-----------+-----------+--------+--------------+
| Id | FirstName | LastName | Gender | DepartmentId |
+----+-----------+-----------+--------+--------------+
| 1 | Rasmus | Johansson | m | 2 |
+----+-----------+-----------+--------+--------------+
1 row in set (0.001 sec)
Das war nur ein kleiner Einblick in systemversionierte Tabellen. Zusätzlich zu den oben gezeigten Beispielen können Sie den Verlauf aus Leistungsgründen auf separaten Partitionen platzieren, Spalten von der Versionierung ausschließen und vieles mehr.
Lesen Sie mehr über systemversionierte Tabellen in der MariaDB-Dokumentation. Holen Sie sich MariaDB Server 10.3 als Teil des MariaDB TX 3.0-Downloads – jetzt verfügbar.