Oracle12c中資料刪除(delete)新特性之資料庫內歸檔功能

sqysl發表於2016-06-22


有些應用有“標記刪除”的概念,即不是刪除資料,而是資料依然保留在表中,只是對應用不可見而已。這種需求通常透過如下方法實現:
1)  給相關表增加一個另外的列,該列儲存標誌資料被刪除的標記。
2)  給每個語句增加一個謂詞,檢查被刪除行的狀態,像:“WHERE deleted = 'N'”,以便排除被刪除行。 謂詞能被硬編碼進SQL語句中,或動態應用類似VPD的安全策略。
資料庫內歸檔是Oracle12c的新特性,該特性可以對現有程式碼做最少改動的情況下,實現了這種“標記刪除”的功能和需求。
1.   開啟資料庫內歸檔
ROW ARCHIVAL子句被用來開啟資料庫內歸檔。該子句可以用在建立表時用在CREATE TABLE中,也可以在表建立後用在ALTER TABLE中。
DROPTABLE tab1 PURGE;
 
--建立表並開啟資料庫內歸檔特性
CREATETABLE tab1 (
  no         NUMBER,
  desc VARCHAR2(50),
  CONSTRAINT tab1_pk PRIMARY KEY (no)
)
ROWARCHIVAL;
 
--禁用並重新開啟資料庫內歸檔特性
ALTERTABLE tab1 NO ROW ARCHIVAL;
ALTERTABLE tab1 ROW ARCHIVAL;
 
--往表中加入1000行資料。
INSERT/*+ APPEND */ INTO tab1
SELECTlevel, 'Description of ' || level
FROM   dual
CONNECTBY level <= 1000;
 
COMMIT;
 
--檢查表內容
SELECTCOUNT(*) FROM tab1;
 
  COUNT(*)
----------
      1000
 
SQL>
開啟資料庫內歸檔特性將會引起表另外增加一個叫做“ORA_ARCHIVE_STATE”系統隱藏列。
COLUMNcolumn_name FORMAT A20
COLUMNdata_type FORMAT A20
 
SELECTcolumn_id,
       column_name,
       data_type,
       data_length,
       hidden_column
FROM   user_tab_cols
WHERE  table_name = 'TAB1'
ORDERBY column_id;
 
 COLUMN_ID COLUMN_NAME         DATA_TYPE           DATA_LENGTH HID
------------------------------ -------------------- ----------- ---
         1NO                  NUMBER                       22 NO
         2DESC        VARCHAR2                     50 NO
          ORA_ARCHIVE_STATE   VARCHAR2                   4000 YES
 
SQL>
預設的,該列的每行被填充為‘0’。
COLUMNora_archive_state FORMAT A20
 
SELECTora_archive_state, COUNT(*)
FROM   tab1
GROUPBY ora_archive_state
ORDERBY ora_archive_state;
 
ORA_ARCHIVE_STATE      COUNT(*)
------------------------------
0                          1000
 
1row selected.
 
SQL>
2.   歸檔(刪除)的行
並非刪除不需要的行,而是把ORA_ARCHIVE_STATE系統隱藏列的值更改為‘1’。這將導致應用看不到這些行。
 
UPDATEtab1
SET    ora_archive_state = '1'
WHERE  no BETWEEN 751 and 1000;
COMMIT;
 
SELECTCOUNT(*) FROM tab1;
 
  COUNT(*)
----------
       750
 
SQL>
其實,可以把ORA_ARCHIVE_STATE列設定為非‘0‘的其他任何字串值來歸檔這些資料,但DBMS_ILM包使用如下常量。
1)  ARCHIVE_STATE_ACTIVE='0'
2)  ARCHIVE_STATE_ARCHIVED='1'
3.   顯示歸檔行
透過將ROW_ARCHIVAL_VISIBILITY設定為ALL,可以使得這些隱藏行對會話可見。將該引數設定回ACTIVE可以再次使這些行不可見。
--使歸檔的行可見
ALTERSESSION SET ROW ARCHIVAL VISIBILITY = ALL;
 
SELECTCOUNT(*) FROM tab1;
 
  COUNT(*)
----------
      1000
SQL>
 
COLUMNora_archive_state FORMAT A20
 
SELECTora_archive_state, COUNT(*)
FROM   tab1
GROUPBY ora_archive_state
ORDERBY ora_archive_state;
 
ORA_ARCHIVE_STATE      COUNT(*)
------------------------------
0                           750
1                           250
 
2rows selected.
 
SQL>
 
--使歸檔行再次不可見
ALTERSESSION SET ROW ARCHIVAL VISIBILITY = ACTIVE;
 
SELECTCOUNT(*) FROM tab1;
 
  COUNT(*)
----------
       750
 
SQL>

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8484829/viewspace-2120685/,如需轉載,請註明出處,否則將追究法律責任。

相關文章