MariaDB Server 10.3 est livré avec une nouvelle fonctionnalité très utile qui facilitera la conception de nombreuses applications. La gestion des versions des données est importante pour plusieurs points de vue. La conformité peut exiger que vous deviez stocker les modifications de données. Pour les requêtes analytiques, vous souhaiterez peut-être consulter les données à un moment précis et à des fins d'audit, quelles modifications ont été apportées et quand est important. De plus, dans le cas d'une table en cours de suppression, il peut être très utile de la récupérer à partir de l'historique. MariaDB Server inclut désormais une fonctionnalité nommée System-Versioned Tables, basée sur la spécification de la norme SQL:2011. Il fournit une gestion automatique des versions des données de table.
Je vais parcourir le concept des tables versionnées par le système avec un exemple très simple, qui vous montrera de quoi il s'agit. Commençons par créer une base de données et une table.
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;
Il ressemble exactement à avant sauf la dernière option de table WITH SYSTEM_VERSIONING, qui active la gestion automatique des versions sur la table. Voyons comment cela fonctionne en insérant une ligne dans le tableau.
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)
Là, nous avons moi comme une ligne dans un tableau. La partie intéressante commence lorsque nous mettons à jour les lignes. Je changerai de service plusieurs fois.
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)
Comme vous pouvez le voir, MariaDB Server indique qu'il y a 1 ligne modifiée pour chaque mise à jour comme d'habitude, mais aussi 1 insérée, ce qui ne serait pas le cas pour une table sans versioning. Chaque mise à jour entraîne une nouvelle version de la ligne, qui doit être insérée dans la table. Comme vous le voyez également ci-dessus, un SELECT normal n'affichera que la dernière version. Pour voir toutes les versions des lignes, MariaDB Server fournit la syntaxe suivante.
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)
Pour pouvoir voir quand les lignes ont été mises à jour, nous souhaitons inclure deux colonnes invisibles créées par la gestion automatique des versions. Invisible Column est une autre nouvelle fonctionnalité intéressante de MariaDB Server 10.3. Les colonnes invisibles de la gestion automatique des versions sont ROW_START et ROW_END. Ils définissent la période pendant laquelle la version de la ligne était/est valide.
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)
La chose intéressante maintenant est de faire des requêtes ponctuelles pour récupérer exactement à quoi ressemblait la table à une date et une heure spécifiques. Nous pouvons le faire en utilisant la syntaxe AS OF :
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)
Ce n'était qu'un petit aperçu des tables versionnées par le système. En plus des exemples présentés ci-dessus, vous pouvez placer l'historique sur des partitions distinctes pour des raisons de performances, exclure des colonnes de la gestion des versions et bien plus encore.
En savoir plus sur les tables versionnées par le système dans la documentation MariaDB. Obtenez MariaDB Server 10.3 dans le cadre du téléchargement de MariaDB TX 3.0 – maintenant disponible.