共计 2343 个字符,预计需要花费 6 分钟才能阅读完成。
有些应用有“标记删除”的概念,即不是删除数据,而是数据依然保留在表中,只是对应用不可见而已。这种需求通常通过如下方法实现:
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 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>
更多 Oracle 相关信息见Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12
本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-01/140027.htm