Oracle 19.10 – „Blockchain Tables“ mehr als nur ein Buzzword?

01.
April
2021
Veröffentlicht von: Daniel Jaouadi

Seit Jahren gibt es in den Nachrichten Meldungen bezüglich Blockchains. Überall hört man von Assets und Firmen, die sich dieser Technologie bedienen. Jetzt hat auch Oracle das Konzept Blockchain aufgegriffen. Doch wie genau funktioniert eine Blockchain in einer Datenbank? Wie administriert man diese und welche Vorteile / Nachteile hat sie?
Das schauen wir uns im Detail an.

Voraussetzungen

Es wird der RU 19.10.0.0 (Januar 2020) benötigt. Zusätzlich braucht man den Patch 32431413 und anschließend muss der compatible Parameter auf 19.10 gesetzt sein.

Ohne den Patch wird beim Erstellen der Tabelle folgender Fehler erzeugt:

CREATE BLOCKCHAIN TABLE BCT_T1 (
        *
ERROR at line 1:
ORA-00901: invalid CREATE command

Und ohne passenden Compatibility Parameter erscheint dieser Fehler:

ERROR at line 1:
ORA-05728: COMPATIBLE needs to be 19.10.0.0.0 or higher to use blockchain table
ORA-00722: Feature "Blockchain table"

Für die Demonstration wurde eine extra Pluggable Database angelegt, da die Tabellen sonst sehr schwer zu entfernen sind.
 

Blockchains in a Nutshell 

Sehr simpel ausgedrückt ist eine Blockchain eine Kette aus Informationen (gespeichert in Blöcken). Diese Kette kann aufgrund des erzeugten Hash-Wertes, welcher aus einem Hash-Wert des vorherigen Blockes und Werten des aktuellen Blocks besteht, nicht ohne weiteres historisch abgeändert werden, da sich sonst der entsprechende Hash und somit die gesamte bereits berechnete Kette ändern würde.
Bildlich dargestellt:

null
 
Dies ermöglicht eine Dokumentation, ohne Sorge zu haben, dass die Informationen einfach geändert werden können. Denn sollte sich einer der Werte eines „alten“ Blockes ändern, so ändert sich entsprechend auch der Hash und die Verschlüsselungsgrundlage des folgenden Blocks, was eine Kettenreaktion auslöst. 
 

Blockchain in Oracle und der Nutzen

Diese Logik lässt sich einfach auf eine Tabelle übertragen. In der Oracle Dokumentation ist das mit folgendem Bild veranschaulicht:

null

Wie man sieht folgt die Tabelle derselben Logik. So bildet die erste Zeile einen Hash-Wert aus einem Hash0 + der Daten dieser Zeile. Dieser neue Hash-Wert Hash1 wird dann in Zeile 2 ebenfalls mit den Daten von Zeile 2 gebildet, usw. Somit sind Zeilen nicht mehr anpassbar. Es entsteht eine „Append-only“-Tabelle.
Der Nutzen so einer Tabelle ist unter anderem bei Audit- und Finanzinformationen sinnvoll. Aber auch Anwesenheitslisten und andere dokumentationswürdigen Informationen profitieren davon.
Blockchain-Tabellen lassen sich wie gewohnt indizieren und partitionieren.
 

Erstellung

Sind die Vorrausetzungen erfüllt, wird eine Blockchain-Tabelle mit einem einfachen „CREATE BLOCKCHAIN TABLE“ Befehl erstellt.
Hier erstellen wir eine Tabelle, welche Renovierungen und Neuerungen an einem Haus dokumentiert:


SQL> CREATE BLOCKCHAIN TABLE BLOCKCHAINTEST.BCT01_HAUS_RENOVIERUNGEN(
ID                NUMBER,
ARBEITER            VARCHAR2(20),
RENOVIERUNGS_ART        VARCHAR2(2000),
KOSTEN              NUMBER,
DATUM                DATE,
CONSTRAINT BCT01_HAUS_RENOVIERUNGEN     PRIMARY KEY (ID)
)
NO DROP UNTIL 1 DAYS IDLE
NO DELETE UNTIL 16 DAYS AFTER INSERT    
HASHING USING "SHA2_512" VERSION "V1";


Die wichtigsten Parameter:

  • NO DROP UNTIL
    Gibt an, wieviel Tage Inaktivität die Tabelle haben muss, bevor sie gedroppt werden kann
  • NO DELETE UNTIL XX DAYS AFTER INSERT
    Zeilen können erst nach diesem Wert entfernt werden (Minimum 16 Tage!).
    • Mit „NO DELETE LOCK“ kann eine Zeile nie mehr gelöscht und der Parameter nicht mehr angepasst werden.
      Also Vorsicht beim Testen!

Diese Parameter können zwar erhöht, aber nicht verringert werden.

Ein Zusätzlicher erwähnenswerter System Parameter ist „BLOCKCHAIN_TABLE_MAX_NO_DROP“. Dieser ermöglicht es, die maximale „NO DROP UNTIL“ Zeit beim Anlegen der Tabelle zu definieren, damit nicht aus Versehen eine Tabelle erstellt wird, die für einen langen Zeitraum nicht mehr löschbar ist. Ideal für Testumgebungen!
 

Data Manipulation Language (DML)

Insert

Das Hinzufügen funktioniert wie gewohnt über ein Insert Statement:

SQL> SELECT * FROM BCT01_HAUS_RENOVIERUNGEN;
ID ARBEITER               RENOVIERUNGS_ART              KOSTEN       DATUM
--- -------------------- ------------------------------ ---------- --------------
  1 DanielJ              Dach Renovierung                     2000 01-MAR-21
  2 MaxM                 Boden verlegt - Wohnzimmer           1500 01-MAR-21

Update

Ein Update hingegen funktioniert nicht, da das in einer Blockchain-Table nicht vorgesehen ist:

SQL> UPDATE BCT01_HAUS_RENOVIERUNGEN SET KOSTEN=1000 WHERE RENOVIERUNGS_ART='BODEN VERLEGT WOHNZIMMER';
ERROR at line 1:
ORA-05715: operation not allowed on the blockchain table

Delete

Auch das Löschen von Einträgen ist über ein normales Delete Statement nicht mehr möglich:

SQL> DELETE FROM BCT01_HAUS_RENOVIERUNGEN WHERE RENOVIERUNGS_ART='BODEN VERLEGT WOHNZIMMER';
ERROR at line 1:
ORA-05715: operation not allowed on the blockchain table


Data Definition Language (DDL)

Da die Inhalte vor Anpassungen geschützt sind, ist die nächste logische Konsequenz: das Objekt selbst zu verändern bzw. zu löschen.

Drop

SQL> drop table BCT01_Haus_Renovierungen;
ERROR at line 1:
ORA-05723: drop blockchain table BCT01_HAUS_RENOVIERUNGEN not allowed

Das Löschen dieser Tabelle kann erfolgreich durchgeführt werden, sobald die „No drop until“ Bedingung erfüllt ist.

Truncate

Auch ein Truncate-Befehl ist nicht möglich:

SQL> TRUNCATE TABLE BCT01_HAUS_RENOVIERUNGEN;
ERROR at line 1:
ORA-05715: operation not allowed on the blockchain table

Alter

Eine Anpassung der Datentypen ist ohne Probleme möglich:

SQL> ALTER TABLE BCT01_HAUS_RENOVIERUNGEN MODIFY (BEARBEITER VARCHAR(1000));
Table altered.


Objekte die über der Tabelle stehen

Drop User

Auch das Löschen des Users ist nicht möglich, wenn die Blockchain-Table nicht löschbar ist:

SQL> DROP USER BLOCKCHAINTEST CASCADE;
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-05723: drop blockchain table BCT01_HAUS_RENOVIERUNGEN not allowed

Anmerkung: Sofern die Tabellen „NO DROP UNTIL“-Policy es erlaubt, wäre es möglich den User zu löschen.

Drop Database

Es bleibt schlussendlich nur noch die Option die entsprechende PDB zu löschen:

SQL> ALTER PLUGGABLE DATABASE BLOCKCHAINDB CLOSE;
Pluggable database altered.

SQL> DROP PLUGGABLE DATABASE BLOCKCHAINDB INCLUDING DATAFILES;
Pluggable database dropped.

Certain Hidden Columns 

Wie in der Abbildung von Oracle zu sehen, gibt es in Blockchain-Tabellen einige versteckte Spalten. Diese sind systemrelevante Zusatzeinträge, um beispielsweise die Hash-Funktionalität zu gewährleisten. Folgende Spalten sind versteckt:

SQL>  SELECT INTERNAL_COLUMN_ID,
       COLUMN_NAME,
       DATA_TYPE,
       DATA_LENGTH,
       HIDDEN_COLUMN
FROM  DBA_TAB_COLS
WHERE TABLE_NAME = 'BCT01_HAUS_RENOVIERUNGEN'
ORDER BY INTERNAL_COLUMN_ID;

COLUMN_NAME                    DATA_TYPE                   DATA_LENGTH HIDDEN_COLUMN
------------------------------ --------------------------- ----------- ----------
ID                             NUMBER                               22 NO
BEARBEITER                     VARCHAR2                           1000 NO
RENOVIERUNGS_ART               VARCHAR2                           2000 NO
KOSTEN                         NUMBER                               22 NO
DATUM                          DATE                                  7 NO
ORABCTAB_INST_ID$              NUMBER                               22 YES
ORABCTAB_CHAIN_ID$             NUMBER                               22 YES
ORABCTAB_SEQ_NUM$              NUMBER                               22 YES
ORABCTAB_CREATION_TIME$        TIMESTAMP(6) WITH TIME ZONE          13 YES
ORABCTAB_USER_NUMBER$          NUMBER                               22 YES
ORABCTAB_HASH$                 RAW                                2000 YES
ORABCTAB_SIGNATURE$            RAW                                2000 YES
ORABCTAB_SIGNATURE_ALG$        NUMBER                               22 YES
ORABCTAB_SIGNATURE_CERT$       RAW                                  16 YES
ORABCTAB_SPARE$                RAW                                2000 YES

In diesen Spalten findet man diverse Informationen, wie zum Beispiel die Erstellungszeit, der generierte Hash, die Signatur, etc.
Mehr dazu in der Dokumentation.

Tabellen-Pflege

Nachdem wir gesehen haben, dass es unmöglich ist, Zeilen aus der Tabelle zu entfernen, stellt sich die Frage: „Wie entfernt man Rows, die nicht mehr in der angegeben Retention Policy sind?“
Hierfür gibt es das neue Package “DBMS_BLOCKCHAIN_TABLE“. Dieses enthält einige (noch undokumentierte) Funktionen, die für diese Art von Tabellen wichtig sind.
Die wichtigsten sind:

  • DELETE_ROWS
    Hiermit lassen sich die „abgelaufenen“ Einträge innerhalb der Tabelle entfernen.
  • SIGN_ROWS
    Hiermit lassen sich Rows signieren. Dies erhöht die Sicherheit, da die Signatur mit in den Hash-Wert gerechnet wird. Man kann nur Rows signieren, die noch keine Signatur besitzen.
  • VERIFY_ROWS
    Hiermit lässt sich der Row-Inhalt mit dem entsprechenden Hash-Wert vergleichen und prüfen.

Somit sind die einzigen derzeitigen Möglichkeiten die Tabelle zu entfernen:

  • Warten bis der Wert „NO DROP UNTIL XX DAYS IDLE“ abgelaufen ist
  • Droppen der Datenbank 
     

Fazit

Allgemein lässt sich sagen, dass Blockchain-Tabellen durchaus ihren Zweck erfüllen. Sie bieten eine Möglichkeit, sicher Daten abzuspeichern und sie ohne großen zusätzlichen Aufwand vor ungewollten Veränderungen zu schützen. Jedoch sollte man nicht den durch die Hash-Funktion erzeugten Overhead unterschätzen. Bei einigen Test waren Inserts bis zu 6-mal langsamer als ohne Blockchain-Table.
Da das Löschen und nachträgliche Bearbeiten nicht möglich bzw. sehr umständlich ist, muss man sehr großen Wert drauf legen, dass nur korrekte Werte in der Tabelle gespeichert werden. Zudem sollte man nicht vergessen, sofern Daten entfernt werden müssen, einen passenden „DELETE_ROWS“ Job einzurichten.
Gerne hilft Ihnen unser Consulting Team bei dieser Thematik weiter.

Jede Menge Know-how für Sie!

In unserer Know-How Datenbank finden Sie mehr als 300 ausführliche Beiträge zu den Oracle-Themen wie DBA, SQL, PL/SQL, APEX und vielem mehr.
Hier erhalten Sie Antworten auf Ihre Fragen.