12cの新機能、In Database ArchiveはOracleで表の論理削除を実現する機能です。
CREATE TABLE tab1 (
id NUMBER,
description VARCHAR2(50),
CONSTRAINT tab1_pk PRIMARY KEY (id)
)
ROW ARCHIVAL;
テスト用に表を作成します。
「ROW ARCHIVAL;」をCREATE TABLE文に付与することで、その表のIn Database Archiveが有効になります。
SQL> ALTER TABLE tab1 NO ROW ARCHIVAL;
表が変更されました。
SQL> ALTER TABLE tab1 ROW ARCHIVAL;
表が変更されました。
ALTER文で既存の表のIn Database Archive有効、無効が設定できます。
COLUMN column_name FORMAT A20
COLUMN data_type FORMAT A20
SELECT column_id,
column_name,
data_type,
data_length,
hidden_column
FROM user_tab_cols
WHERE table_name = 'TAB1'
ORDER BY column_id;
COLUMN_ID COLUMN_NAME DATA_TYPE DATA_LENGTH HID
---------- -------------------- -------------------- ----------- ---
1 ID NUMBER 22 NO
2 DESCRIPTION VARCHAR2 50 NO
ORA_ARCHIVE_STATE VARCHAR2 4000 YES
SYS_NC00003$ RAW 126 YES
descでは表示されませんが、user_tab_colsビューを見ると「ORA_ARCHIVE_STATE」列が追加されていることがわかります。
INSERT /*+ APPEND */ INTO tab1
SELECT level,'Description of ' || level
FROM dual
CONNECT BY level <= 1000;
COMMIT;
SELECT count(*) FROM tab1;
COUNT(*)
----------
1000
テスト用にデータ1000件を挿入します。
COLUMN ORA_ARCHIVE_STATE FORMAT A20
SELECT ora_archive_state, COUNT(*)
FROM tab1
GROUP BY ora_archive_state
ORDER BY ora_archive_state;
ORA_ARCHIVE_STATE COUNT(*)
-------------------- ----------
0 1000
1000件のデータのORA_ARCHIVE_STATE列は、最初は全て0に設定されています。
UPDATE tab1
SET ora_archive_state = '1'
WHERE id BETWEEN 751 and 1000;
COMMIT;
751件目から1000件目のORA_ARCHIVE_STATEを「1」に更新します。
SELECT COUNT(*) FROM tab1;
COUNT(*)
----------
750
countで表示されるデータ件数が750件になりました。
751件目から1000件目が「論理削除」されたことになります。
「論理」削除なので実体は存在します。
見えなくなっただけです。
SQL> ALTER SESSION SET ROW ARCHIVAL VISIBILITY = ALL;
セッションが変更されました。
SQL> SELECT COUNT(*) FROM tab1;
COUNT(*)
----------
1000
ROW ARCHIVAL VISIBILITY値をALLに設定することで、全てのデータが見えるようになります。
SQL> ALTER SESSION SET ROW ARCHIVAL VISIBILITY = ACTIVE;
セッションが変更されました。
SQL> SELECT COUNT(*) FROM tab1;
COUNT(*)
----------
750
ROW ARCHIVAL VISIBILITY値をACTIVEに設定することで、ORA_ARCHIVE_STATE列が1に設定されている行が見えなくなります。(デフォルト)
CREATE TABLE tab1 (
id NUMBER,
description VARCHAR2(50),
CONSTRAINT tab1_pk PRIMARY KEY (id)
)
ROW ARCHIVAL;
テスト用に表を作成します。
「ROW ARCHIVAL;」をCREATE TABLE文に付与することで、その表のIn Database Archiveが有効になります。
SQL> ALTER TABLE tab1 NO ROW ARCHIVAL;
表が変更されました。
SQL> ALTER TABLE tab1 ROW ARCHIVAL;
表が変更されました。
ALTER文で既存の表のIn Database Archive有効、無効が設定できます。
COLUMN column_name FORMAT A20
COLUMN data_type FORMAT A20
SELECT column_id,
column_name,
data_type,
data_length,
hidden_column
FROM user_tab_cols
WHERE table_name = 'TAB1'
ORDER BY column_id;
COLUMN_ID COLUMN_NAME DATA_TYPE DATA_LENGTH HID
---------- -------------------- -------------------- ----------- ---
1 ID NUMBER 22 NO
2 DESCRIPTION VARCHAR2 50 NO
ORA_ARCHIVE_STATE VARCHAR2 4000 YES
SYS_NC00003$ RAW 126 YES
descでは表示されませんが、user_tab_colsビューを見ると「ORA_ARCHIVE_STATE」列が追加されていることがわかります。
INSERT /*+ APPEND */ INTO tab1
SELECT level,'Description of ' || level
FROM dual
CONNECT BY level <= 1000;
COMMIT;
SELECT count(*) FROM tab1;
COUNT(*)
----------
1000
テスト用にデータ1000件を挿入します。
COLUMN ORA_ARCHIVE_STATE FORMAT A20
SELECT ora_archive_state, COUNT(*)
FROM tab1
GROUP BY ora_archive_state
ORDER BY ora_archive_state;
ORA_ARCHIVE_STATE COUNT(*)
-------------------- ----------
0 1000
1000件のデータのORA_ARCHIVE_STATE列は、最初は全て0に設定されています。
UPDATE tab1
SET ora_archive_state = '1'
WHERE id BETWEEN 751 and 1000;
COMMIT;
751件目から1000件目のORA_ARCHIVE_STATEを「1」に更新します。
SELECT COUNT(*) FROM tab1;
COUNT(*)
----------
750
countで表示されるデータ件数が750件になりました。
751件目から1000件目が「論理削除」されたことになります。
「論理」削除なので実体は存在します。
見えなくなっただけです。
SQL> ALTER SESSION SET ROW ARCHIVAL VISIBILITY = ALL;
セッションが変更されました。
SQL> SELECT COUNT(*) FROM tab1;
COUNT(*)
----------
1000
ROW ARCHIVAL VISIBILITY値をALLに設定することで、全てのデータが見えるようになります。
SQL> ALTER SESSION SET ROW ARCHIVAL VISIBILITY = ACTIVE;
セッションが変更されました。
SQL> SELECT COUNT(*) FROM tab1;
COUNT(*)
----------
750
ROW ARCHIVAL VISIBILITY値をACTIVEに設定することで、ORA_ARCHIVE_STATE列が1に設定されている行が見えなくなります。(デフォルト)