有些应用有“标记删除”的概念,即不是删除数据,而是数据依然保留在表中,只是对应用不可见而已。这种需求通常通过如下方法实现:

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>

Oracle12c中数据删除(delete)新特性之数据库内归档功能的更多相关文章

  1. Oracle12c中性能优化增强新特性之数据库智能闪存

    智能闪存功能最初在XD中引入.从Oracle11.2.0.2开始,除了用于XD存储,还可用于任何闪盘.Oracle12c中,不需卷管理器就可以使用闪盘. 1.  简介 智能闪存在solaris和lin ...

  2. Oracle12c中PL/SQL(DBMS_SQL)新特性之隐式语句结果(DBMS_SQL.RETURN_RESULT and DBMS_SQL.GET_NEXT_RESULT)

    隐式数据结果特性将能简化从其他数据库到Oracle12c存储过程迁移.1. 背景T-SQL中允许查询结果的隐式返回.例如:下面T-SQL存储过程隐式返回查询结果.CREATE PROCEDURE Ge ...

  3. Oracle12c中容错&amp;性能新特性之表空间组

    1.        简介 表空间组可以使用户消耗来自多个表空间的临时表空间.表空间组有如下特点: 1)      至少包含一个表空间.表空间组中包含的最大表空间数没有限制. 2)      和表空间共 ...

  4. 简单理解ECMAScript2015中的箭头函数新特性

    箭头函数(Arrow functions),是ECMAScript2015中新加的特性,它的产生,主要有以下两个原因:一是使得函数表达式(匿名函数)有更简洁的语法,二是它拥有词法作用域的this值,也 ...

  5. 重新想象 Windows 8.1 Store Apps (89) - 通信的新特性: 下载数据, 上传数据, 上传文件

    [源码下载] 重新想象 Windows 8.1 Store Apps (89) - 通信的新特性: 下载数据, 上传数据, 上传文件 作者:webabcd 介绍重新想象 Windows 8.1 Sto ...

  6. ABAP 7.52 中的Open SQL新特性

    S/4 HANA 1709 已经在几个月前发布,随之而来的是ABAP 7.52. 本文翻译了更新文档中有关Open SQL的部分 本文链接:http://www.cnblogs.com/hhelibe ...

  7. ABAP 7.40, SP08 中的 Open SQL 新特性

    1,使用 data_source~*指定列 在7.40, SP08中,可以在SELECT语句中使用data_source~*来指定选取不同的数据库表.视图的全部列来作为结果集.它也可以和单独指定的列c ...

  8. 【SharePoint学习笔记】第3章 SharePoint列表新特性以及数据访问

    第3章 SharePoint列表新特性以及数据访问   使用CAML查询语言     CAML:协作应用程序标记语言 Collaboration Application Markup Language ...

  9. [SQL基础教程] 4-2 数据删除(DELETE)

    [SQL基础教程] C4 数据更新 4-2 数据删除(DELETE) DROP TABLE / DELETE DROP TABLE - 完全删除表 DELETE - 仅删除数据,保留表容器 DELET ...

  10. Java 9中的 9个 新特性

    Java 9 中的 9个 新特性 java 7 2011发布,Java 8 2014发布,java9发布于2017年9月21日. 你可能已经听说过 Java 9 的模块系统,但是这个新版本还有许多其它 ...

随机推荐

  1. label语句、break语句和continue语句

    label语句 可以在代码中添加标签,以便使用.以下是label语句的语法: label:statement 示例: start: for (var i = 0; i < count; i++) ...

  2. 定制django admin页面的跳转

    在django admin的 change_view,  add_view和delete_view页面,如果想让页面完成操作后跳转到我们想去的url,该怎么做 默认django admin会跳转到ch ...

  3. 设置redis访问密码

    在服务器上,这里以linux服务器为例,为redis配置密码. 1.第一种方式 (当前这种linux配置redis密码的方法是一种临时的,如果redis重启之后密码就会失效,) (1)首先进入redi ...

  4. DDR2是什么意思

    DDR2DDR2(Double Data Rate 2) SDRAM是由JEDEC(电子设备工程联合委员会)进行开发的新生代内存技术标准,它与上一代DDR内存技术标准最大的不同就是,虽然同是采用了在时 ...

  5. 【第十八章】 springboot + thymeleaf

    代码结构: 1.ThymeleafController package com.xxx.firstboot.web; import org.springframework.stereotype.Con ...

  6. Unity3D学习笔记(十):Physics类和射线

    物理系统:碰撞器.触发器等 力:有大小有方向的矢量,有受力点位置(和向量的区别) ----F = ma(m质量,a加速度,质量越大,加速度越小,停下来越慢) ----m1v1 = m2v2(冲量守恒定 ...

  7. 【Android实验】第一个Android程序与Activity生命周期

    目录 第一个Android程序和Activity生命周期 实验目的 实验要求 实验过程 1. 程序正常启动与关闭 2. 外来电话接入的情况 3. 外来短信接入的情况 4. 程序运行中切换到其他程序(比 ...

  8. mysql中index与Multiple-Column Indexes区别与联系

    索引对提升SELECT/UPDATE语句查询速度有着立竿见影的效果,有索引和无索引,查询速度往往差几个数量级. 本次讨论一下index(每列作为一个索引,单列索引)和Multiple-Column I ...

  9. 如何新建一个datatable,并往表里赋值

    顺序是新建对象-->新建列-->新建行,示例代码如下: DataTable dt=new DataTable(); //新建对象 dt.Columns.Add("姓名" ...

  10. #使用ListView更新数据出现闪烁解决办法

    //使用双缓冲:添加新类继承ListView 对其重写 public class DoubleBufferListView : ListView { public DoubleBufferListVi ...