阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Oracle 12c中数据删除(delete)新特性之数据库内归档功能

108次阅读
没有评论

共计 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

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计2343字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中