Oracle 12c から In-Database Archiving が追加になった
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 に特化するのであれば使用しても良いかもしれません。