Linux-Magazin_-_Januar_2019

(singke) #1
wurde mit dem Standard SQL:2011 defi-
niert und speichert die gesamte Historie
einer Zeile vom Erstellen bis hin zum Lö-
schen ab. Das ermöglicht die Datenana-
lyse für einen bestimmten Zeitpunkt oder
das Rückverfolgen von Änderungen bei
einem Audit. So wird eine versionierte
Tabelle angelegt:
SQL> CREATE TABLE accounting (
name VARCHAR(55),
amount DECIMAL(11, 2),
`date` DATE
) WITH SYSTEM VERSIONING;
Nun trägt der Anwender einige Werte in
die Tabelle ein und ändert sie. Darunter
beispielsweise im März:
SQL> UPDATE accounting SET amount = U
amount + 500.0, `date` = '2018‑03‑13' U
WHERE name = 'Übeltäter';

Irgendwann später lässt sich dann je-
derzeit genau nachvollziehen, wie der
Kontostand des Kollegen »Mitarbeiter«
zu einem bestimmten Zeitpunkt, zum
Beispiel dem 1. März, ausgesehen hat
(Listing 10).

Es gibt noch weitere Möglichkeiten, den
Zeitbereich einzuschränken mit »FROM
...TO... « oder »BETWEEN ...AND... «.
Darüber hinaus bietet Maria DB die Mög-
lichkeit, über den Marker »trxid« die Zei-
len Transaktions-genau abzufragen. Eine
bereits bestehende Tabelle ist wie folgt
auf System-Versioning umstellbar:
SQL> ALTER TABLE accounting ADD U
SYSTEM VERSIONING;

Vorsicht ist beim Backup geboten: Wenn
mit »mysqldump« gesichert wird, geht
die gesamte Historie verloren. Es emp-
fiehlt sich daher, eine physische Backup-
Methode wie Maria Backup zu nutzen.

Weitere Neuerungen


Hinzugekommen ist außerdem die von
der Storage Engine unabhängige Spalten-
komprimierung. Dieses Feature verrin-
gert besonders den Fußabdruck von sehr
großen Spalten (etwa »BLOB«, »TEXT«,
»VARCHAR«, »VARBINARY« oder auch
»JSON«):

führte, funktioniert jetzt einwand-
frei (Listing 8). Dasselbe gilt auch für
»UPDATE«-Statements. Neuerdings sind
außerdem »ORDER BY«- und »LIMIT«-
Klauseln bei Multi-Table-Updates zu-
lässig. Neben den bisher bestehenden
»UNION«- und »UNION ALL«-Mengen-
Operatoren kennt Maria DB jetzt auch
»EXCEPT (MINUS)« und »INTERSECT«.
Das illustriert Listing 9.
Mit etwas komplizierteren »JOIN«-
Konstrukten hat man das zwar bisher
auch hingekriegt, mit den beiden neuen
Klauseln sieht das Ganze aber wesent-
lich sprechender und einfacher aus. Das
nicht standardkonforme »MINUS«, das
dem »EXCEPT« entspricht und bei Oracle-
Entwicklern bekannt ist, wird von Maria
DB leider noch nicht unterstützt.


System Versioned Tables


Neben zahlreichen weiteren kleinen
Verbesserungen im SQL-Layer sticht vor
allem noch das neue Feature System
Versioned Tables hervor. Dieses Feature


01 SQL> CREATE TABLE customer (
02 first_name VARCHAR(33)
03 , last_name VARCHAR(55)
04 );
05
06 SQL> CREATE TABLE user (
07 first_name VARCHAR(33)
08 , last_name VARCHAR(55)
09 );
10
11 SQL> INSERT INTO customer VALUES ('Hans',
'Meier'), ('Sepp', 'Müller'),
12 ('Fritz', 'Huber');
13 SQL> INSERT INTO user VALUES ('Oman',
'Klept'), ('Hans', 'Meier'), ('Getfor',

14 'Free');
15
16 # Im ersten Fall wollen wir alle Nutzer
ermitteln, welche nicht Kunden sind:
17
18 SQL> SELECT first_name, last_name FROM user
19 EXCEPT
20 SELECT first_name, last_name FROM customer
21 ;
22 +‑‑‑‑‑‑‑‑‑‑‑‑+‑‑‑‑‑‑‑‑‑‑‑+
23 | first_name | last_name |
24 +‑‑‑‑‑‑‑‑‑‑‑‑+‑‑‑‑‑‑‑‑‑‑‑+
25 | Oman | Klept |
26 | Getfor | Free |
27 +‑‑‑‑‑‑‑‑‑‑‑‑+‑‑‑‑‑‑‑‑‑‑‑+

28
29 # Und im zweiten Fall wollen wir wissen wer
Nutzer und Kunde ist:
30
31 SQL> SELECT first_name, last_name FROM user
32 INTERSECT
33 SELECT first_name, last_name FROM customer
34 ;
35 +‑‑‑‑‑‑‑‑‑‑‑‑+‑‑‑‑‑‑‑‑‑‑‑+
36 | first_name | last_name |
37 +‑‑‑‑‑‑‑‑‑‑‑‑+‑‑‑‑‑‑‑‑‑‑‑+
38 | Hans | Meier |
39 +‑‑‑‑‑‑‑‑‑‑‑‑+‑‑‑‑‑‑‑‑‑‑‑+

Listing 9: Neue Mengenoperatoren

01 SQL> CREATE TABLE customer (
02 id INT UNSIGNED
03 , year SMALLINT UNSIGNED
04 , revenue DECIMAL(11, 2)
05 , customer_class CHAR(1)
06 );
07
08 SQL> INSERT INTO customer
09 VALUES (1, 2016, 100.0), (2, 2016, 0.0), (3,
2016, 999.99);
10 SQL> INSERT INTO customer
11 VALUES (1, 2017, 500.0), (2, 2017, 0.0), (3,

2017, 100.00);
12 SQL> INSERT INTO customer
13 VALUES (1, 2018, 400.0), (2, 2018, 0.0), (3,
2018, 0.0);
14
15 SQL> SELECT * FROM customer;
16 +‑‑‑‑‑‑+‑‑‑‑‑‑+‑‑‑‑‑‑‑‑‑+
17 | id | year | revenue |
18 +‑‑‑‑‑‑+‑‑‑‑‑‑+‑‑‑‑‑‑‑‑‑+
19 | 1 | 2016 | 100.00 |
20 | 2 | 2016 | 0.00 |
21 | 3 | 2016 | 999.99 |

22 | 1 | 2017 | 500.00 |
23 | 2 | 2017 | 0.00 |
24 | 3 | 2017 | 100.00 |
25 | 1 | 2018 | 400.00 |
26 | 2 | 2018 | 0.00 |
27 | 3 | 2018 | 0.00 |
28 +‑‑‑‑‑‑+‑‑‑‑‑‑+‑‑‑‑‑‑‑‑‑+
29
30 SQL> DELETE FROM customer
31 WHERE id IN (SELECT id FROM customer GROUP BY
id HAVING SUM(revenue) = 0.0);

Listing 8: Löschen selbstreferenzierter Zeilen

69

http://www.linux-magazin.de

Sysadmin

Maria DB 10.3
Free download pdf