はじめに

こんにちは。Oracle Databaseの検証チームです。

今回は、Oracle Database 21cで実装され、Oracle Database 23aiで機能が強化された、Blockchain Tableをご紹介いたします。

この記事を書いた社員は先日OCI Certified Foundations Associateを取得した社員です!

Blockchain Tableとは

Blockchain Tableは、Oracle Database 21cで追加された機能()で、高い耐改ざん性と監査性を持った特別なデータベース・テーブルです。
また、Oracle Database 23aiでは、機能が強化されており、さらに使いやすく進化しています。

Oracle Database 19cではRU19.10以降のアップデートを適用することで使用することができます。

Blockchain Tableの機能

データの削除・変更に制約がある、あるいは完全に不可

Blockchain Tableには大きく分けて2つの特徴があります。
そのうちの一つが、データの削除・変更に制約がある、あるいは完全に不可という点です。

例えば、以下のような制限がBlockchain Tableには存在しています。

  • 行のDELETEが不可、あるいは設定した保持期間が過ぎた行のみ可能。
  • 行のUPDATEとMERGEが不可。
  • テーブルのDROPが不可、あるいは設定した保護期間が過ぎた場合のみ可能。
  • テーブルのTRUNCATE、パーティションのDROPが不可

これらの制約によって、Blockchain Tableでは格納されたデータの改ざんを防いでいます。

ハッシュチェーンによる改ざんの監視

そして、Blockchain Tableのもう一つの大きな特徴が、ハッシュチェーンによる改ざんの監視です。

Blockchain Tableでは行が追加された際、非表示列にハッシュ値を格納します。
このハッシュ値は、行のデータ+前の行のハッシュ値から計算されており、ハッシュ値を通じて、前後の行が繋がれた状態になります。

そのため、何らかの形でデータが削除、あるいは変更された場合に、ハッシュ値を参照することで、それを検知することができるような仕組みになっています。

他にも様々な機能が実装されている

上記の機能はいずれもOracle Database 21cで使用できる基本的な機能です。

これらの他にもBlockchain Tableを使いやすくするための細かい機能が多く実装されているほか、Oracle Database 23aiでは、列の追加・削除機能ユーザー・チェーンなど、複数の機能が追加されています。

今回はそれらを含めた、Blockchain Tableの機能について、実際に表を作成して検証してみました。

Blockchain Tableの検証

Blockchain Tableの作成

それでは、実際にBC_TESTという名前のBlockchain Tableを作成してみます。

SQL> CREATE BLOCKCHAIN TABLE BC_TEST (ID NUMBER, NAME VARCHAR2(50))
2 NO DROP UNTIL 7 DAYS IDLE
3 NO DELETE UNTIL 16 DAYS AFTER INSERT
4 HASHING USING "SHA2_512" VERSION "V1";

Table created.

Blockchain Tableを作成する際に指定できる、Blockchain Table特有の主なオプションとしては、以下の4つがあります。

NO DROP [ UNTIL n DAYS IDLE ]

NO DROP:データが挿入されたテーブルのDROP操作を無期限で禁止します。
NO DROP UNTIL X DAYS IDLE:テーブルのDROP操作を、最後にデータが挿入されてからX日経過するまで禁止します。

NO DELETE { [ LOCKED ] | (UNTIL n DAYS AFTER INSERT [ LOCKED ]) }

NO DELETE:行のDELETE操作を無期限で禁止します。
NO DELETE UNTIL X DAYS AFTER INSERT:行のDELETE操作をデータの挿入からX日経過するまで禁止します。

上記にLOCKEDを加えることで、ALTER TABLEによる設定の変更を禁止することができます。

HASHING USING "X"

このオプションでハッシュ値の計算に使用するアルゴリズムを指定することができますが、2025年9月時点では、SHA2_512しか指定できないため、実質的に固定となっています。

VERSION "X"

このオプションで、Blockchain Tableのバージョンを指定することができます。
Oracle Database 21cまでは、V1しか存在しませんでしたが、Oracle Database 23aiで、V2が追加されました。
Oracle Database 23aiで追加された機能の多くはV2のみが対象となっているため、基本的にはV2の使用が推奨されます。

今回は、
NO DROP UNTIL 7 DAYS IDLE
NO DELETE UNTIL 16 DAYS AFTER INSERT
HASHING USING “SHA2_512”
VERSION “V1”
を指定して作成してみました。

DROPによるテーブルの削除

まずは、DROP操作の検証から行います。
今回のように、NO DROP UNTIL 7 DAYS IDLEと、DROP制限に日数を指定した場合、
データを挿入する前であれば、DROP操作を行うことができます。

SQL> CREATE BLOCKCHAIN TABLE BC_TEST (ID NUMBER, NAME VARCHAR2(50))
2 NO DROP UNTIL 7 DAYS IDLE
3 NO DELETE UNTIL 16 DAYS AFTER INSERT
4 HASHING USING "SHA2_512" VERSION "V1";

Table created.

SQL>
SQL> --この時点ではDROPが可能
SQL>
SQL> DROP TABLE BC_TEST;

Table dropped.

作成したテーブルにデータを挿入すると、DROP操作を行うことができなくなります。

SQL> CREATE BLOCKCHAIN TABLE BC_TEST (ID NUMBER, NAME VARCHAR2(50))
2 NO DROP UNTIL 7 DAYS IDLE
3 NO DELETE UNTIL 16 DAYS AFTER INSERT
4 HASHING USING "SHA2_512" VERSION "V1";

Table created.

SQL>
SQL> --データを挿入
SQL> INSERT INTO BC_TEST
2 VALUES (1, 'Alice'),
3        (2, 'Bob'),
4        (3, 'Charlie'),
5        (4, 'Dave'),
6        (5, 'Ellen'),
7        (6, 'Frank');

6 rows created.
SQL> commit;

Commit complete.

SQL>
SQL> --データを挿入したのでDROPができなくなる
SQL>
SQL> DROP TABLE BC_TEST;
DROP TABLE BC_TEST
*
ERROR at line 1:
ORA-05723: dropping BC_TEST, which is a non-empty blockchain or immutable
table, is not allowed
Help: https://docs.oracle.com/error-help/db/ora-05723/

DELETE・UPDATEによるデータの操作

次に、DELETEやUPDATEなどのテーブル内のデータを変更する操作を検証してみます。
テーブルは上で作成したBC_TESTを使用します。

SQL> --DELETE文の実行
SQL>
SQL> DELETE FROM BC_TEST WHERE ID = 1;
DELETE FROM BC_TEST WHERE ID = 1
*
ERROR at line 1:
ORA-05715: operation not allowed on the blockchain or immutable table
Help: https://docs.oracle.com/error-help/db/ora-05715/

SQL> --UPDATE文の実行
SQL>
SQL> UPDATE BC_TEST
2 SET ID = 1, Name = 'Alex'
3 WHERE ID = 1;
UPDATE BC_TEST
*
ERROR at line 1:
ORA-05715: operation not allowed on the blockchain or immutable table
Help: https://docs.oracle.com/error-help/db/ora-05715/

このようにBlockchain Tableでは、DELETEやUPDATEによって、データを削除、または変更しようとするとエラーが出るようになっています。

NO DELETEオプションで、DELETEができるようになるまでの日数を指定した場合は、その日数が経過した場合のみデータの削除が可能です。
UPDATEによるデータの変更は、NO DELETEで指定した日数を過ぎていても行うことはできません。

指定したオプションの変更

Blockchain Tableの作成時に指定した、NO DROPやNO DELETEのオプションは、
LOCKEDを指定していないかつ、日数を増やす変更の場合でのみ、ALTER TABLE句で変更が可能です。

先ほど作成したBC_TESTテーブルのオプションを変更してみます。

SQL> --変更前の値の確認
SQL>
SQL> SELECT row_retention, row_retention_locked,
2 table_inactivity_retention, hash_algorithm
3 FROM user_blockchain_tables
4 WHERE table_name='BC_TEST';

ROW_RETENTION ROW TABLE_INACTIVITY_RETENTION HASH_ALG
------------- --- -------------------------- --------
           16  NO                          7 SHA2_512

SQL> --NO DROPオプションの変更
SQL>
SQL> ALTER TABLE BC_TEST NO DROP UNTIL 16 DAYS IDLE;

Table altered.

SQL> -- NO DELETEオプションの変更
SQL>
SQL> ALTER TABLE BC_TEST NO DELETE UNTIL 20 DAYS AFTER INSERT;

Table altered.

SQL> --変更後の値の確認
SQL>
SQL> SELECT row_retention, row_retention_locked,
2 table_inactivity_retention, hash_algorithm
3 FROM user_blockchain_tables
4 WHERE table_name='BC_TEST';

ROW_RETENTION ROW TABLE_INACTIVITY_RETENTION HASH_ALG
------------- --- -------------------------- --------
           20  NO                         16 SHA2_512

無事に変更が確認できました。
SELECT文で取得している値はそれぞれ以下を表しています。

  • ROW_RETENTION:行が挿入されてから変更できるようになるまでの日数
  • ROW_RETENTION_LOCKED:ROW_RETENTIONの変更がロックされているかどうか
  • TABLE_INACTIVITY_RETENTION:最後のデータ挿入からテーブルの削除が可能になるまでの日数
  • HASH_ALG:ハッシュの計算に使われるアルゴリズム

ただし、以下のように、DROPやDELETE操作が可能になるまで日数を減らす変更はできないことには注意が必要です。

SQL> --NO DROPの日数を16日から10日に
SQL>
SQL> ALTER TABLE BC_TEST NO DROP UNTIL 10 DAYS IDLE;
ALTER TABLE BC_TEST NO DROP UNTIL 10 DAYS IDLE
*
ERROR at line 1:
ORA-05732: retention value cannot be lowered
Help: https://docs.oracle.com/error-help/db/ora-05732/

SQL> -- NO DELETEの日数を20日から18日に
SQL>
SQL> ALTER TABLE BC_TEST NO DELETE UNTIL 18 DAYS AFTER INSERT;
ALTER TABLE BC_TEST NO DELETE UNTIL 18 DAYS AFTER INSERT
*
ERROR at line 1:
ORA-05732: retention value cannot be lowered
Help: https://docs.oracle.com/error-help/db/ora-05732/

ハッシュ値の確認

Blockchain Tableでは、複数の非表示列が存在しており、そちらをSELECT文で参照することで、ハッシュ値を確認することができます。

Blockchain Tableに存在する非表示列に関する詳しい情報は、Oracle公式サイトに記載されています。
次に、行に付与されたハッシュ値を確認してみます。

SQL> SELECT ID,
2 NAME,
3 ORABCTAB_HASH$ "HASH"
4 FROM BC_TEST;

  ID NAME                 HASH
---- -------------------- --------------------------------------------------------------------------------------------------------------------------------
   1 Alice                3C50451DEE2DA15A18047BF8629DCF19BF31794D71C78D8C62A5402FC5123DE72447492F5FE31151AB8F0C092B89E4125ACF3CD9E0381E16A96120F2C0C13A99
   2 Bob                  A4CB258D3339A65AAF8A58310A2DF6C07379B9DF872AF81436A88AEB2F714F4F942467E9F3120EAC6ADE8D90CB6475925D276E8ED347F124FB75C61CBE454289
   3 Charlie              009639CCEB6C0C2FAE91D1B3E5CBF7563623F4912035051F457D0CEC8D06EE9DF94642020EC7B9D796E07076A401FD9589DC59D355D3EABD17EF504BE3151E3D
   4 Dave                 7D00952B29B3384A06FE3F5C5F0AB0C4F9807EBD9D7FF7F072BA148B9083F27958310940BF6B40A20322A1AC18DA38B10B662FE69974CBD1D990E37C416B6E0F
   5 Ellen                4514C7146E81E95188E65BCD3F373C431F26A58A21413A1215568EEE654CD1889BB3FE991C2D50787B1FBC678DFA95A5037ACD40CFDAF4BE4D50B7C033EB57C4
   6 Frank                BF36C3E178FBB5E9BEAA11857E5D820551AEB12CBA814CA0E5EE61BD25EB241DE5CA1BA0E960AE9E2E7B5F1763C758EBA1DCAE471BEFF3AD7338A2CD463A5492

6 rows selected.

このように、それぞれの行にハッシュ値が格納されていることが確認できます。

Oracle Database 23aiで追加された新機能

最後に、Oracle Database 23aiでBlockchain Tableに追加された機能をいくつか検証していきます。

列の追加・削除機能

従来のBlockchain Tableでは、列の追加、及び削除は許可されていませんでしたが、Oracle Database 23aiから、これらが可能になりました。

この機能を使用するには、VERSIONをV2に指定してBlockchain Tableを作成する必要があります。
既にV1で作成されたBlockchain TableをV2に変更することはできない点には注意してください。

早速、実機で試していきます。

SQL> --VERSION V1のテーブルを作成
SQL> CREATE BLOCKCHAIN TABLE BC_V1 (ID NUMBER, NAME VARCHAR2(50))
2 NO DROP UNTIL 7 DAYS IDLE
3 NO DELETE UNTIL 16 DAYS AFTER INSERT
4 HASHING USING "SHA2_512" VERSION "V1";

Table created.

SQL> --列の追加
SQL> alter table BC_V1 add (SCORE NUMBER);
alter table BC_V1 add (SCORE NUMBER)
*
ERROR at line 1:
ORA-05715: operation not allowed on the blockchain or immutable table
Help: https://docs.oracle.com/error-help/db/ora-05715/


SQL> --列の削除
SQL> alter table BC_V1 drop column NAME;
alter table BC_V1 drop column NAME
*
ERROR at line 1:
ORA-05715: operation not allowed on the blockchain or immutable table
Help: https://docs.oracle.com/error-help/db/ora-05715/


SQL> --VERSION V2のテーブルを作成
SQL> CREATE BLOCKCHAIN TABLE BC_V2 (ID NUMBER, NAME VARCHAR2(50))
2 NO DROP UNTIL 7 DAYS IDLE
3 NO DELETE UNTIL 16 DAYS AFTER INSERT
4 HASHING USING "SHA2_512" VERSION "V2"; 
Table created.  
SQL> --列の追加
SQL> alter table BC_V2 add (SCORE NUMBER);

Table altered.


SQL> --列の削除
SQL> alter table BC_V2 drop column NAME;

Table altered.

このように、VERSIONをV2に指定することで、列の追加、削除ができることが確認できました。

ユーザー・チェーン

元々、Blockchain Tableでは、1インスタンスあたり最大32個までの、システムが自動的に生成するシステム・チェーンが作られ、それぞれの行はランダムにそれらのチェーンが割り振られていました。

Oracle Database 23ai以降では、最大3つの列のセットを指定してユーザー・チェーンを作成することで、前述のシステム・チェーンとは別に、指定した列の値(または値の組み合わせ)毎に異なるチェーンを割り振ることができるようになりました。

この機能により、従来のシステム・チェーンよりも、検出の範囲をより絞りやすくなり、改ざんの検出がしやすくなることが期待されます。
それでは、実際にユーザー・チェーンを使用してテーブルを作成してみましょう。

SQL> --テーブルの作成
SQL> CREATE BLOCKCHAIN TABLE BC_UC (ID NUMBER, NAME VARCHAR2(50), SCORE NUMBER)
2 NO DROP UNTIL 7 DAYS IDLE
3 NO DELETE UNTIL 16 DAYS AFTER INSERT
4 HASHING USING "SHA2_512"
5 WITH USER CHAIN NAME_CHAIN (NAME)
6 VERSION "V2";

Table created.

SQL> --データを挿入
SQL> INSERT INTO BC_UC
2 VALUES (1, 'Alice', 89),
3 (2, 'Bob', 70),
4 (3, 'Charlie', 90),
5 (4, 'Alice', 60),
6 (5, 'Charlie', 100),
7 (6, 'Dave', 82);

6 rows created.

SQL>
SQL> COMMIT;

Commit complete.

SQL> select * from BC_UC;

ID NAME SCORE
---------- -------------------------------------------------- ----------
1 Alice 89
2 Bob 70
3 Charlie 90
4 Alice 60
5 Charlie 100
6 Dave 82

6 rows selected.

ここでは、Nameという列に基づいたユーザー・チェーンを作成しています。
そのため、Name列の値が同じ行は、全て同じチェーンが割り振られており、
例えば、NAME列にAliceという値が入っている1行目と4行目やCharlieという値が入っている3行目と5行目はそれぞれ同じチェーンが割り振られています。

ユーザーチェーン内の行の順序や、ユーザーチェーンのハッシュ値は、
それぞれORABCTAB_ROW_VERSION$ORABCTAB_USER_CHAIN_HASH$という非表示列で確認することができます。

SQL> select ID, NAME, SCORE, ORABCTAB_ROW_VERSION$, ORABCTAB_USER_CHAIN_HASH$ from BC_UC;

        ID NAME            SCORE ORABCTAB_ROW_VERSION$ ORABCTAB_USER_CHAIN_HASH$
---------- ---------- ---------- --------------------- ----------------------------------------------------------------
         1 Alice              89                     1 0103033A26860CCC81F9C736C3A8C3B1DFF1EE7970E9BB393777F0E83EC81E52
                                                       5C6CAB55BEE973BA8DC795A6EC6E19DFFEFB9848CC048C00D029368C01823B7C

         2 Bob                70                     1 13E877390098D1E1584D854A4198884F12917FE5DD47CC99B35F52D73D5B6478
                                                       3F16E3546E10AEAC219C5E1CC4FBC54DB658BBA5A5DEFE637257984B8B6FEB56

         3 Charlie            90                     1 68A4DBC24BA13310552DF9C4CE91839A15D70D7CC7759F098D81E534684893B5
                                                       3D16DFFC9F37D7DEF2DC3578992C874BFD102D06EDD042CF1B7715E182CD6138

         4 Alice              60                     2 90DB613BD2934BDFF83625E17326D08043898FF0593B0F67FB56EE5A8CE3BBEE
                                                       B7BD4C412FDC91640830FBD8AFE2E7295764243FC0CE34CDC4A293130B7E1C2B

         5 Charlie           100                     2 1108087EBA3CA6300555F5E6A4262EB542BC6FE43D55BD932191471DCF3CD86E
                                                       F85241B86FD5F14E83D771FDC201D337CA320AC5FA09D14414D1FC5DAAF61448

         6 Dave               82                     1 8E56E3B531FB47A25DFABDFDE8798E3FA9B6DD77A2B5C40DDCB9D70A45555A49
                                                       DF4527CCAEB0D1BFA73AE190BA1FC9FD7C764DFE103383B41E224F8BB3B118F2


6 rows selected.

この例では、ユーザーチェーン内の行の順序を示すORABCTAB_ROW_VERSION$が、同じチェーンを使用する1行目と4行目、3行目と5行目で1から2に増えていることが確認できます。

最後に

今回は、Blockchain Tableについて、紹介・検証をしてみました。

INSERTのみが可能という制約が存在するため、その用途は限定されますが、取引履歴や監査ログといった、信頼性の求められるデータの記録の際には非常に有効であると言えるでしょう。

こうした場面では、データの完全性や履歴の透明性を確保する手段として、高い耐改ざん性監査性を持つ、Blockchain Tableの活躍が期待できそうです。

 

弊社ではOracle Databaseに詳しいエンジニアが多数在籍しています。何かご不明なことやご興味を持たれたことがございましたら、お気軽に当社までお問い合わせください。

最後までお読みいただきありがとうございました。

Oracleの課題、専門家が解決します


Oracle導入を相談する

豊富な実績で最適な解決策をご提供

投稿者プロフィール

技術チーム
技術チーム
DBひとりでできるもんを盛り上げるべく、技術チームが立ち上がり早8年。ひとりでできるもんと言いつつ、技術者が読んでプッとなるような、極めてピンポイントでマニアックな技術ネタを執筆しています!
最新技術情報や資格情報をチェックしたいアナタ!毎日遊びに来てください。きっとお役に立てます。