Blockchain Tableを試す(2) (Oracle Database 19c)

[前記事]()ではBlockchain Tableの作成を試したので、本記事ではBlockchain Tableに対する操作を行います。

# DMLの制約
## INSERT文の実行
INSERT文には制約はありません。トランザクション制御にも変更はありません。

```
SQL> INSERT INTO block1 VALUES (100, 'data1');

1行が作成されました。

SQL> COMMIT;

コミットが完了しました。

SQL> SELECT * FROM block1;

        C1 C2
---------- ----------
       100 data1
```

## UPDATE文の実行
UPDATE文は更新対象のレコード有無にかかわらず失敗します。下記の例では更新対象レコード（WHERE c1=300）は存在しませんが、エラーORA-05715が発生しています。

```
SQL> UPDATE block1 SET c2='update' WHERE c1=300;
UPDATE block1 SET c2='update' WHERE c1=300
       *
行1でエラーが発生しました。:
ORA-05715: operation not allowed on the blockchain or immutable table
```

## DELETE文の実行
DELETE文の実行は失敗します。レコードの削除はDBMS_BLOCKCHAIN_TABLEパッケージのDELETE_EXPIRED_ROWSプロシージャで行います。

```
SQL> DELETE FROM block1 WHERE c1=100;
DELETE FROM block1 WHERE c1=100
            *
行1でエラーが発生しました。:
ORA-05715: operation not allowed on the blockchain or immutable table
```

# DDLの制約
## TRUNCATE文の実行
  TRUNCATE TABLE文は実行できません。

```
SQL> TRUNCATE TABLE block1;
TRUNCATE TABLE block1
               *
行1でエラーが発生しました。:
ORA-05715: operation not allowed on the blockchain or immutable table
```

## DROP TABLE文の実行
　テーブル作成直後の場合、DROP TABLE文は成功します。

```
SQL> CREATE BLOCKCHAIN TABLE block2 (c1 NUMBER, c2 VARCHAR2(10))
  2        NO DROP UNTIL 1 DAYS IDLE
  3        NO DELETE UNTIL 16 DAYS AFTER INSERT
  4        HASHING USING sha2_512 VERSION v1
  5        TABLESPACE blockts1;

表が作成されました。

SQL> DROP TABLE block2;

表が削除されました。
```

しかしレコードが格納された状態ではDROP TABLE文は指定された期間失敗します。

```
SQL> DROP TABLE block1;
DROP TABLE block1
           *
行1でエラーが発生しました。:
ORA-05723: drop blockchain or immutable table BLOCK1 not allowed
```

## ALTER TABLE文の実行
列の追加や削除は失敗しますが、制約の追加／削除は成功します。

```
SQL> ALTER TABLE block1 DROP COLUMN c2;
ALTER TABLE block1 DROP COLUMN c2
*
行1でエラーが発生しました。:
ORA-05715: operation not allowed on the blockchain or immutable table

SQL>  ALTER TABLE block1 ADD (c3 VARCHAR2(10));
 ALTER TABLE block1 ADD (c3 VARCHAR2(10))
*
行1でエラーが発生しました。:
ORA-05715: operation not allowed on the blockchain or immutable table

SQL> ALTER TABLE block1 ADD CONSTRAINT pk_block1 PRIMARY KEY (c1);

表が変更されました。
```

テーブル削除の制限期間はデフォルト設定では変更することができます。しかし現在の値よりも短くすることはできません。

```
SQL> ALTER TABLE block1 NO DROP UNTIL 2 DAYS IDLE;

表が変更されました。

SQL> SELECT table_name, table_inactivity_retention FROM user_blockchain_tables;

TABLE_NAME                     TABLE_INACTIVITY_RETENTION
------------------------------ --------------------------
BLOCK1                                                  2

SQL> ALTER TABLE block1 NO DROP UNTIL 1 DAYS IDLE;
ALTER TABLE block1 NO DROP UNTIL 1 DAYS IDLE
*
行1でエラーが発生しました。:
ORA-05732: retention value cannot be lowered
```

# 強制削除
期限が来ていないBlockchain Tableを強制的に削除する方法を探ります。

## ユーザーの削除
DROP USER文を使ってBlockchain Tableを削除しようとすると失敗します。

```
SQL> DROP USER scott CASCADE;
DROP USER scott CASCADE
*
行1でエラーが発生しました。:
ORA-00604: 再帰SQLレベル1でエラーが発生しました。 ORA-05723: drop
blockchain or immutable table BLOCK1 not allowed
```

# 表領域の削除
DROP TABLESPACE文を使ってBlockchain Tableを含む表領域の削除も失敗します。

```
SQL> DROP TABLESPACE blockts1 INCLUDING CONTENTS AND DATAFILES;
DROP TABLESPACE blockts1 INCLUDING CONTENTS AND DATAFILES
*
行1でエラーが発生しました。:
ORA-00604: 再帰SQLレベル1でエラーが発生しました。 ORA-05723: drop
blockchain or immutable table BLOCK1 not allowed
```

## PLUGGABLE DATABASEの削除
Blockchain Tableを含むPLUGGABLE DATABASEの削除は成功します。

```
SQL> ALTER PLUGGABLE DATABASE pdb1 CLOSE;

プラガブル・データベースが変更されました。

SQL> DROP PLUGGABLE DATABASE pdb1 INCLUDING DATAFILES;

プラガブル・データベースが削除されました。
```