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.
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:
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.
Diese Logik lässt sich einfach auf eine Tabelle übertragen. In der Oracle Dokumentation ist das mit folgendem Bild veranschaulicht:
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.
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";
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!
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
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
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
Da die Inhalte vor Anpassungen geschützt sind, ist die nächste logische Konsequenz: das Objekt selbst zu verändern bzw. zu löschen.
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.
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
Eine Anpassung der Datentypen ist ohne Probleme möglich:
SQL> ALTER TABLE BCT01_HAUS_RENOVIERUNGEN MODIFY (BEARBEITER VARCHAR(1000));
Table altered.
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.
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.
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.
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:
Somit sind die einzigen derzeitigen Möglichkeiten die Tabelle zu entfernen:
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.
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.