MariaDB Server 10.3 include una nuova funzionalità molto utile che faciliterà la progettazione di molte applicazioni. Il controllo delle versioni dei dati è importante per diverse prospettive. La conformità potrebbe richiedere l'archiviazione delle modifiche ai dati. Per le query analitiche, potresti voler esaminare i dati in un momento specifico e per scopi di controllo, quali modifiche sono state apportate e quando è importante. Inoltre, nel caso in cui una tabella venga eliminata, può essere di grande utilità recuperarla dalla cronologia. MariaDB Server ora include una funzionalità denominata Tabelle con versione di sistema, che si basa sulla specifica nello standard SQL:2011. Fornisce il controllo automatico delle versioni dei dati delle tabelle.
Illustrerò il concetto di tabelle con versione di sistema con un esempio molto semplice, che ti mostrerà di cosa si tratta. Iniziamo creando un database e una tabella.
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;
Sembra esattamente come prima tranne l'ultima opzione della tabella WITH SYSTEM_VERSIONING, che attiva il controllo delle versioni automatico sulla tabella. Vediamo come funziona inserendo una riga nella tabella.
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ì abbiamo me come una riga in una tabella. La parte interessante inizia quando aggiorniamo le righe. Cambierò reparto un paio di volte.
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)
Come puoi vedere MariaDB Server dice che c'è 1 riga modificata per ogni aggiornamento come al solito, ma anche 1 inserita, cosa che non sarebbe il caso per una tabella senza il controllo delle versioni. Ogni aggiornamento provoca una nuova versione della riga, che deve essere inserita nella tabella. Come vedi anche sopra, un normale SELECT mostrerà solo l'ultima versione. Per vedere tutte le versioni delle righe MariaDB Server fornisce la seguente sintassi.
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)
Per poter vedere quando le righe sono state aggiornate, vogliamo includere due colonne invisibili che vengono create dal controllo automatico delle versioni. Colonne invisibili è un'altra entusiasmante nuova funzionalità di MariaDB Server 10.3. Le colonne invisibili del controllo delle versioni automatico sono ROW_START e ROW_END. Definiscono il periodo di tempo per il quale la versione della riga era/è valida.
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 cosa interessante ora è eseguire query point-in-time per recuperare esattamente l'aspetto della tabella in una data e ora specifiche. Possiamo farlo usando la sintassi 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)
Questo è stato solo un piccolo assaggio delle tabelle con versione di sistema. Oltre agli esempi mostrati sopra, puoi posizionare la cronologia su partizioni separate per motivi di prestazioni, escludere colonne dal controllo delle versioni e molto altro.
Leggi di più sulle tabelle con versione di sistema nella documentazione di MariaDB. Ottieni MariaDB Server 10.3 come parte del download di MariaDB TX 3.0 – ora disponibile.