[Oracle Database] 19cでブロック・チェーン・テーブルが作れるようになったと聞いてやってみた

# はじめに

19cにブロック・チェーン・テーブルがバック・ポートされたことを知りました。

[Connor McDonaldさんのブログ](https://connor-mcdonald.com/2021/02/03/blockchain-tables-are-here-in-19c/)によると、利用可能になる条件はRU19.10 + 個別パッチ32431413の適用だそうです。あと、初期化パラメータcompatibleを19.10.0にする必要があるようです


# 環境

```CONSOLE
$ opatch lspatches
32431413;19.10 RU FOR ORACLE IS MISSING QCPLK.O WHICH GETS LINKED INTO LIBGENERIC19.A
32218454;Database Release Update : 19.10.0.0.210119 (32218454)
29585399;OCW RELEASE UPDATE 19.3.0.0.0 (29585399)

OPatch succeeded.
$ sql / as sysdba
SQL> show parameter compatible
NAME              TYPE    VALUE
----------------- ------- -------
compatible        string  19.10.0
```

# ブロック・チェーン・テーブルで遊ぶ
マニュアルの[演習: ブロックチェーン表および行の管理](https://docs.oracle.com/cd/F32587_01/ftnew/practice-managing-oracle-blockchain-tables-and-rows.html)をみていろいろ遊んでみます

## 作ってみる
```
## ユーザを作成
SQL> alter session set container=pdb01;
SQL> create user test identified by <Password> default tablespace users quota unlimited on users;
SQL> grant connect, resource to test;
SQL> exit;

$ sql test/<Password>@$(hostname -s)/<PDBServiceName>
SQL> show user
USER is "TEST"

## ブロック・チェーン・テーブル!
SQL> CREATE BLOCKCHAIN TABLE ledger_emp (employee_id NUMBER, salary NUMBER)
      NO DROP UNTIL 31 DAYS IDLE
      NO DELETE LOCKED
      HASHING USING "SHA2_512" VERSION "v1";

Table created.
```
create blockchain tableのオプション句については[ここ](https://orablogs-jp.blogspot.com/2020/02/native-blockchain-tables.html)などを参照

## dropしてみる

```CONSOLE
SQL> drop table ledger_emp;

Table dropped.
```

え？？DROPできる。。よく考えたら、データ入れてなかった。もう一度

```CONSOLE
SQL> CREATE BLOCKCHAIN TABLE ledger_emp (employee_id NUMBER, salary NUMBER)
      NO DROP UNTIL 31 DAYS IDLE
      NO DELETE LOCKED
      HASHING USING "SHA2_512" VERSION "v1";

Table created.

SQL> insert into ledger_emp select level, 100*level from dual connect by level <=100;

100 rows created.

SQL> commit;

Commit complete.

```

もう一度DROP！今度は、エラーになってくれた。

```CONSOLE
SQL> drop table ledger_emp;
drop table ledger_emp
           *
ERROR at line 1:
ORA-05723: drop blockchain table LEDGER_EMP not allowed
```

削除！

```CONSOLE
SQL> delete from ledger_emp;
delete from ledger_emp
            *
ERROR at line 1:
ORA-05715: operation not allowed on the blockchain table
```

更新!

```CONSOLE
SQL> update ledger_emp set employee_id=100 where employee_id=1;
update ledger_emp set employee_id=100 where employee_id=1
       *
ERROR at line 1:
ORA-05715: operation not allowed on the blockchain table

```

Truncate！

```CONSOLE
SQL> truncate table ledger_emp;
truncate table ledger_emp
               *
ERROR at line 1:
ORA-05715: operation not allowed on the blockchain table
```


保存期間を減らす! おお、これもだめ

```CONSOLE
SQL> ALTER TABLE ledger_emp NO DROP UNTIL 1 DAYS IDLE;
ALTER TABLE ledger_emp NO DROP UNTIL 1 DAYS IDLE
*
ERROR at line 1:
ORA-05732: retention value cannot be lowered
```

保存期間を増やすのはOKらしい

```CONSOLE
SQL> ALTER TABLE ledger_emp NO DROP UNTIL 40 DAYS IDLE;

Table altered.
```

SYSでDROP! おお、SYSでもエラーになる

```CONSOLE
SQL> conn / as sysdba
Connected.
SQL> alter session set container=pdb01;
SQL> drop table test.ledger_emp;
drop table test.ledger_emp
                *
ERROR at line 1:
ORA-05723: drop blockchain table LEDGER_EMP not allowed
```

SYSでユーザごとDROP！

```CONSOLE
SQL> drop user test cascade;
drop user test cascade
*
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-05723: drop blockchain table LEDGER_EMP not allowed

```

消えない・・・PDBドロップ！これはさすがに消えてくれた

```CONSOLE
SQL> alter pluggable database pdb01 close;

Pluggable database altered.

SQL> drop pluggable database pdb01 including datafiles;

Pluggable database dropped.

```