MariaDB Server 10.3 wordt geleverd met een nieuwe, zeer handige functie die het ontwerp van veel applicaties zal vergemakkelijken. Gegevensversiebeheer is belangrijk voor verschillende perspectieven. Naleving kan vereisen dat u gegevenswijzigingen moet opslaan. Voor analytische vragen wilt u misschien gegevens op een bepaald tijdstip bekijken en voor controledoeleinden, welke wijzigingen zijn aangebracht en wanneer belangrijk is. In het geval dat een tabel wordt verwijderd, kan het ook van grote waarde zijn om deze uit de geschiedenis te herstellen. MariaDB Server bevat nu een functie met de naam System-Versioned Tables, die is gebaseerd op de specificatie in de SQL:2011-standaard. Het biedt automatische versiebeheer van tabelgegevens.
Ik zal het concept van tabellen met systeemversies doornemen met een heel eenvoudig voorbeeld, dat je laat zien waar het allemaal om draait. Laten we beginnen met het maken van een database en een tabel.
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;
Het ziet er precies hetzelfde uit als voorheen, behalve de laatste tabeloptie MET SYSTEM_VERSIONING, die de automatische versiebeheer op de tafel inschakelt. Laten we eens kijken hoe het werkt door een rij in de tabel in te voegen.
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)
Daar hebben we mij als één rij in een tabel. Het interessante deel begint wanneer we rijen bijwerken. Ik zal een paar keer van afdeling veranderen.
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)
Zoals je kunt zien, vertelt MariaDB Server dat er zoals gewoonlijk 1 gewijzigde rij is voor elke update, maar ook 1 ingevoegd, wat niet het geval zou zijn voor een tabel zonder versiebeheer. Elke update veroorzaakt een nieuwe versie van de rij, die in de tabel moet worden ingevoegd. Zoals je hierboven ook ziet zal een normale SELECT alleen de laatste versie tonen. Om alle versies van de rijen te zien, biedt MariaDB Server de volgende syntaxis.
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)
Om te kunnen zien wanneer de rijen zijn bijgewerkt, willen we twee onzichtbare kolommen opnemen die zijn gemaakt door het automatische versiebeheer. Invisible Column is een andere opwindende nieuwe functie van MariaDB Server 10.3. De onzichtbare kolommen voor automatisch versiebeheer zijn ROW_START en ROW_END. Ze definiëren de tijdsperiode waarvoor de versie van de rij geldig was/is.
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)
Het interessante is nu om point-in-time-query's uit te voeren om precies op te halen hoe de tabel eruitzag op een specifieke datum en tijd. We kunnen dit doen door de AS OF-syntaxis te gebruiken:
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)
Dit was slechts een klein kijkje in tabellen met systeemversies. Naast de hierboven getoonde voorbeelden kunt u om prestatieredenen geschiedenis op aparte partities plaatsen, kolommen uitsluiten van versiebeheer en nog veel meer.
Lees meer over tabellen met systeemversies in de MariaDB-documentatie. Download MariaDB Server 10.3 als onderdeel van de MariaDB TX 3.0-download – nu beschikbaar.