sql >> Base de Datos >  >> RDS >> MariaDB

Control automático de versiones de datos en MariaDB Server 10.3

MariaDB Server 10.3 viene con una característica nueva y muy útil que facilitará el diseño de muchas aplicaciones. El control de versiones de datos es importante desde varias perspectivas. El cumplimiento puede requerir que necesite almacenar los cambios de datos. Para consultas analíticas, es posible que desee ver los datos en un momento específico y con fines de auditoría, qué cambios se realizaron y cuándo es importante. Además, en el caso de que se elimine una tabla, puede ser de gran valor recuperarla del historial. MariaDB Server ahora incluye una función denominada Tablas con versiones del sistema, que se basa en la especificación del estándar SQL:2011. Proporciona versiones automáticas de los datos de la tabla.

Examinaré el concepto de tablas con versiones del sistema con un ejemplo muy simple, que le mostrará de qué se trata. Comencemos por crear una base de datos y una tabla.

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;

Se ve exactamente como antes, excepto la última opción de tabla CON SYSTEM_VERSIONING, que activa el control de versiones automático en la tabla. Veamos cómo funciona insertando una fila en la tabla.

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)

Ahí me tenemos como una fila en una tabla. La parte interesante comienza cuando actualizamos las filas. Cambiaré de departamento un par de veces.

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 puede ver, MariaDB Server dice que hay 1 fila cambiada para cada actualización como de costumbre, pero también 1 insertada, lo que no sería el caso para una tabla sin control de versiones. Cada actualización genera una nueva versión de la fila, que debe insertarse en la tabla. Como también puede ver arriba, un SELECT normal solo mostrará la última versión. Para ver todas las versiones de las filas, MariaDB Server proporciona la siguiente sintaxis.

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 cuándo se han actualizado las filas, queremos incluir dos columnas invisibles que se crean mediante el control de versiones automático. Columnas invisibles es otra característica nueva y emocionante de MariaDB Server 10.3. Las columnas invisibles del control de versiones automático son ROW_START y ROW_END. Definen el período de tiempo durante el cual la versión de la fila era/es 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)

Lo interesante ahora es hacer consultas puntuales para recuperar exactamente cómo se veía la tabla en una fecha y hora específicas. Podemos hacer esto usando la sintaxis 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)

Esto fue solo un pequeño vistazo a las tablas con versiones del sistema. Además de los ejemplos que se muestran arriba, puede colocar el historial en particiones separadas por motivos de rendimiento, excluir columnas del control de versiones y mucho más.

Lea más sobre las tablas con versiones del sistema en la documentación de MariaDB. Obtenga MariaDB Server 10.3 como parte de la descarga de MariaDB TX 3.0, ahora disponible.