MariaDB
 sql >> Base de Dados >  >> RDS >> MariaDB

Versionamento automático de dados no MariaDB Server 10.3

O MariaDB Server 10.3 vem com um recurso novo e muito útil que facilitará o design de muitos aplicativos. O versionamento de dados é importante para várias perspectivas. A conformidade pode exigir que você precise armazenar alterações de dados. Para consultas analíticas, você pode querer examinar os dados em um momento específico e para fins de auditoria, quais alterações foram feitas e quando é importante. Além disso, no caso de uma tabela ser excluída, pode ser de grande valia recuperá-la do histórico. O MariaDB Server agora inclui um recurso chamado System-Versioned Tables, que é baseado na especificação do padrão SQL:2011. Ele fornece versionamento automático dos dados da tabela.

Analisarei o conceito de tabelas com versão do sistema com um exemplo muito simples, que mostrará do que se trata. Vamos começar criando um banco de dados e uma tabela.

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;

Parece exatamente como antes, exceto a última opção da tabela WITH SYSTEM_VERSIONING, que ativa o versionamento automático na tabela. Vamos ver como funciona inserindo uma linha na tabela.
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á temos-me como uma linha em uma tabela. A parte interessante começa quando atualizamos as linhas. Vou mudar de departamento algumas vezes.
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)

Como você pode ver, o MariaDB Server informa que há 1 linha alterada para cada atualização como de costume, mas também 1 inserida, o que não seria o caso de uma tabela sem versionamento. Cada atualização causa uma nova versão da linha, que deve ser inserida na tabela. Como você também vê acima, um SELECT normal mostrará apenas a versão mais recente. Para ver todas as versões das linhas, o MariaDB Server fornece a seguinte sintaxe.
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)

Para poder ver quando as linhas foram atualizadas, queremos incluir duas colunas invisíveis que são criadas pelo controle de versão automático. Colunas Invisíveis é outro novo recurso interessante do MariaDB Server 10.3. As colunas invisíveis do controle de versão automático são ROW_START e ROW_END. Eles definem o período de tempo para o qual a versão da linha era/é válida.
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)

O interessante agora é fazer consultas point-in-time para recuperar exatamente a aparência da tabela em uma data e hora específicas. Podemos fazer isso usando a sintaxe 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)

Este foi apenas um pequeno vislumbre das tabelas com versão do sistema. Além dos exemplos mostrados acima, você pode colocar o histórico em partições separadas por motivos de desempenho, excluir colunas do controle de versão e muito mais.

Leia mais sobre tabelas com versão do sistema na documentação do MariaDB. Obtenha o MariaDB Server 10.3 como parte do download do MariaDB TX 3.0 – já disponível.