Oracle12c中資料刪除(delete)新特性之資料庫內歸檔功能
有些應用有“標記刪除”的概念,即不是刪除資料,而是資料依然保留在表中,只是對應用不可見而已。這種需求通常透過如下方法實現:
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle12c中資料泵新特性之功能增強(expdp, impdp)Oracle
- Oracle 12c 新特性之 資料庫內歸檔(In-Database Archiving)Oracle資料庫Database
- 達夢資料庫DM8之刪除歸檔日誌檔案資料庫
- Oracle Database 12c新特性 In-Database Archiving資料庫內歸檔OracleDatabase資料庫
- Mysql資料庫delete刪除後資料恢復報告MySql資料庫delete資料恢復
- Oralce資料庫關閉歸檔日誌並且刪除歸檔日誌資料庫
- ORACLE12C新特性之線上遷移活躍的資料檔案Oracle
- 【MySQL】批量刪除mysql中資料庫中的表MySql資料庫
- Oracle12c功能增強新特性之維護&升級&恢復&資料泵等Oracle
- 非歸檔資料檔案誤刪除解決辦法
- mysql資料庫中刪除資料的三種形式 drop和 truncate 和 deleteMySql資料庫delete
- DELETE OBSOLETE不刪除歸檔日誌以及歸檔的備份集delete
- Oracle12c中多宿主容器資料庫(CDBs)和可插拔資料庫(PDBs)新特性之執行指令碼Oracle資料庫指令碼
- Oracle12c資料庫連結匯出與刪除(DatabaseLink)Oracle資料庫Database
- indexedDB 刪除資料庫Index資料庫
- 刪除歸檔
- 檢視oracle 資料庫中的級聯刪除(delete cascade)Oracle資料庫delete
- 無備份恢復(歸檔模式)已刪除資料檔案模式
- 歸檔模式下,線上刪除資料檔案的完全恢復模式
- RMAN delete archivelog命令刪除歸檔日誌及歸檔日誌拷貝deleteHive
- 表管理之四:刪除資料Delete與truncate的使用區別delete
- delete/truncate刪除資料索引空間問題delete索引
- 【北亞資料庫資料恢復】使用delete未加where子句刪除全表資料的Mysql資料庫資料恢復資料庫資料恢復deleteMySql
- MongoDB之資料刪除MongoDB
- ASM 中使用RMAN delete archivelog until time刪除歸檔檔案ASMdeleteHive
- 已為資料庫映象啟動資料庫,必須刪除資料庫映象才能刪除該資料庫資料庫
- 【RAC】刪除RAC資料庫節點(一)——刪除資料庫例項資料庫
- SQL2K資料庫開發四之刪除資料庫SQL資料庫
- Oracle12c功能增強 新特性之管理功能的增強Oracle
- 如何使用資料庫Scheduler定時刪除歸檔|美創運維日記資料庫運維
- Oracle12C新特性-線上重新命名遷移資料檔案(一)Oracle
- 1.7.8. 刪除資料庫密碼檔案資料庫密碼
- Oracle12c多租戶資料庫備份與恢復 - PDB中資料檔案的恢復Oracle資料庫
- 面試題: 資料庫:delete和trancate刪除表記錄的區別面試題資料庫delete
- Oracle 刪除資料檔案Oracle
- oracle刪除資料檔案Oracle
- 刪除空資料檔案
- Laravel 資料庫裡的資料刪除Laravel資料庫