重庆思庄Oracle、Redhat认证学习论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1470|回复: 0
打印 上一主题 下一主题

ORACLE 12C新特性之ROW ARCHIVE

[复制链接]
跳转到指定楼层
楼主
发表于 2019-9-18 23:28:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在一些场景中,当我们不需要表中的某些行时,需要发布delete语句来删除。但是有时候并不是
想在物理上真正的删除这些数据,在传统的表设计中,我们一般都加多一个栏位来表示逻辑删除。
比如is_delete,当应用程序在处理时,把is_delete也加入到where条件中来表示行是不是真正的删
除了.

           在12C中,引入了一个新特性叫作row archive,可以让数据库自动来做这些操作.这个特性也叫作
In-Database Archiving.

         在oracle 12.1.0.2的版本中创建一个表

        DONGDONGTANG> create table t1 (a int,b  varchar2(100));  --创建表

        Table created.
DONGDONGTANG> select * from t1;  --insert两行测试数据

                 A B
---------- ----------
         1 testa
         2 testb

        DONGDONGTANG>  alter table t1 row archival;  --允许ROW ARCHIVE

        Table altered.

       
DONGDONGTANG> select column_name from user_tab_cols where table_name='T1';

        COLUMN_NAME
--------------------------------------------------------------------------------
A
B
SYS_NC00003$
ORA_ARCHIVE_STATE

        在允许row archival后,系统会自动会表增加栏位ORA_ARCHIVE_STATE,用来表示数据可用性情况。

        如果我们用select * from t1这种方式,这个栏位是不会被显示的,只有显式指定栏位,才会在结果集中
显示栏位.

       
DONGDONGTANG> select a,b,ora_archive_state from t1;

                 A B          ORA_ARCHIV
---------- ---------- ----------
         1 testa      0
         2 testb      0

        我通过显式指定,可以查出ora_archive_state,默认值为0,表示该行对应用程序可见.

        现在我们回到之前的需求场景中来,比如现在计划a=1的这条记录,对应用程序不可见.

        DONGDONGTANG> update t1 set ora_archive_state=1 where a=1;

        1 row updated.

        DONGDONGTANG> commit;

        Commit complete.

        DONGDONGTANG> select * from t1;

                 A B
---------- ----------
         2 testb

        DONGDONGTANG> select a,b,ora_archive_state from t1;

                 A B          ORA_ARCHIV
---------- ---------- ----------
         2 testb      0

       
可以看到现在在应用程序是查不出a=1的这条记录了.

        但是对于管理员或是某些特殊的会话,我又计划想他们看见这些行。可以通过设置会话来改变.

       
DONGDONGTANG> alter session set row archival visibility=ALL;

        Session altered.

        DONGDONGTANG>  select a,b from t1;

                 A B
---------- ----------
         1 testa
         2 testb

        当前会话又可以看到之前被隐藏的行了.

        如果你不想再使用row archive了,取消即可,数据不受影响.

       
DONGDONGTANG> alter table t1 no row archival;

        Table altered.

        DONGDONGTANG> select a,b from t1;

                 A B
---------- ----------
         1 testa
         2 testb
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 支持支持 反对反对
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|重庆思庄Oracle、Redhat认证学习论坛 ( 渝ICP备12004239号-4 )

GMT+8, 2024-4-24 11:34 , Processed in 0.084428 second(s), 19 queries .

重庆思庄学习中心论坛-重庆思庄科技有限公司论坛

© 2001-2020

快速回复 返回顶部 返回列表