Oracle 12c から In-Database Archiving が追加になった

メモ:  Category:oracle

Oracle 12c から論理削除のような In-Database Archiving という行を非アクティブとしてマークする機能が追加されました。表に対して In-Database Archiving を有効に設定すると ORA_ARCHIVE_STATE という見えない列が追加され、 ORA_ARCHIVE_STATE の値が「0」以外の場合、データは論理削除(非アクティブにマーク)されたように扱われます。

row archival

In-Database Archiving に対応したテーブルを作成するには、 row archival 句 を指定します。

SQL> CREATE TABLE T_LOGIC_DEL
  (
     col1 NUMBER,
     col2 NUMBER,
     col3 NUMBER
  ) ROW ARCHIVAL;

表が作成されました。

データを追加して通常と違いがないことを確認します。

SQL> INSERT INTO T_LOGIC_DEL (COL1,COL2,COL3) VALUES (10,20,30);

1行が作成されました。

SQL> INSERT INTO T_LOGIC_DEL (COL1,COL2,COL3) VALUES (100,200,300);

1行が作成されました。


SQL> SELECT * FROM T_LOGIC_DEL;

      COL1       COL2       COL3
---------- ---------- ----------
        10         20         30
       100        200        300

テーブル定義にはなかった、 ORA_ARCHIVE_STATE 列を更新し結果を確認すると1行減っていることが確認できます。

SQL> UPDATE T_LOGIC_DEL SET ORA_ARCHIVE_STATE = '1' WHERE COL1 = 10;

1行が更新されました。

SQL> commit;

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

SQL> SELECT * FROM T_LOGIC_DEL;

      COL1       COL2       COL3
---------- ---------- ----------
       100        200        300

非アクティブにマークした行も出力したい場合は、 ALTER SESSION で ROW ARCHIVAL VISIBILITY を 「ALL」に変更します。デフォルトの状態に戻すには、「ACTIVE」を指定します。

SQL> ALTER SESSION SET ROW ARCHIVAL VISIBILITY = ALL;

セッションが変更されました。

SQL> SELECT * FROM T_LOGIC_DEL;

     COL1       COL2       COL3
---------- ---------- ----------
       10         20         30
      100        200        300

明示的に ORA_ARCHIVE_STATE を指定すると値を確認することができるので、「ROW ARCHIVAL VISIBILITY = ALL」とした状態で次の SELECT 文を実行してみます。

SQL> SELECT A.*,ORA_ARCHIVE_STATE FROM T_LOGIC_DEL A;

      COL1       COL2       COL3      ORA_ARCHIVE_STATE
---------- ---------- ---------- ----------------------
        10         20         30   1
       100        200        300   0

以上で、インデータベース・アーカイブの確認ができました。最近は、 IS_ACTIVE 列を作り物理削除をしない DataBase 設計をするようにしているので Oracle に特化するのであれば使用しても良いかもしれません。

bluenote by BBB