Oracle 11g 的新特性 —— 只读表

红薯 发布于 2012/07/26 09:36
阅读 3K+
收藏 28

解读下一代网络:算力网络正从理想照进现实!>>>

上次我们介绍了 Oracle 11g 的新特性 —— 虚拟列,今天我们介绍另外一个新特性 —— 只读表。

只读表跟普通的表没有区别,但不允许任何事务对其执行任何 DML(Insert, Update, Delete) 操作。

在 Oracle 11g 之前,“只读”只对数据库和表空间有效,而到了 11g,你可以设置某个表为只读表。

在 11g 之前,如果我们要实现一个只读表,必须通过触发器和约束限制来实现。

1- 表触发器

下面我们简单创建一个表和触发器来演示这种方法:

CREATE TABLE READ_ONLY_TABLE (COL1 NUMBER);  
   
 CREATE OR REPLACE TRIGGER READ_ONLY_TABLE_TRG  
   BEFORE DELETE OR INSERT OR UPDATE  
   ON READ_ONLY_TABLE  
   REFERENCING NEW AS NEW OLD AS OLD  
   FOR EACH ROW  
 DECLARE  
 BEGIN  
   RAISE_APPLICATION_ERROR (-20001, 'Table is read only table.');  
 END;  
   
 INSERT INTO READ_ONLY_TABLE  
    VALUES (1);  

运行这个脚本你将会得到错误信息:

ORA -20001, Table is read only table.

2- 检查约束

使用下面的 SQL 语句:

 CREATE TABLE READ_ONLY_TABLE2 (COL1 NUMBER);  
   
 ALTER TABLE READ_ONLY_TABLE2 ADD CONSTRAINT READ_ONLY_CONST CHECK(0=0) DISABLE VALIDATE;  
   
 INSERT INTO READ_ONLY_TABLE2  
    VALUES (1); 

执行的报错信息:

ORA-25128: No insert/update/delete on table with constraint SCOTT.READ_ONLY_CONST) disabled and validated

很麻烦对不对?

而 Oracle 11g 可通过语法 ALTER TABLE table_name RAED ONLY;  来实现只读表,看看下面 SQL 语句:

CREATE TABLE READ_ONLY_TABLE3 (COL1 NUMBER);  
ALTER TABLE READ_ONLY_TABLE3 READ ONLY;  
INSERT INTO READ_ONLY_TABLE3 VALUES (1); 

执行后的报错信息是:

ORA-12081: update operation not allowed on table "SCOTT"."READ_ONLY_TABLE3"

可是我怎么知道一个表是否只读表呢?

你可以通过数据字典视图 (ALL_TABLES,DBA_TABLES,USER_TABLES,TABS)中的 READ_ONLY 列得知,如:

SELECT table_name, READ_ONLY FROM tabs;  

运行结果:

全文完!

英文原文OSCHINA原创翻译

加载中
0
H丶World
H丶World
只读表除了不能做DML操作外,和普通表有什么区别?性能方面会提升吗?
mahone
mahone
肯定会有提升啊。。。应该不用锁了吧。。。
0
符冬
符冬
只读表,如果不能insert,那里面的那些只读数据是怎么添进去的呢?
wad12302
wad12302
那就是说只能修改一次了,不然每次修改数据要先改表属性()|
IdleMan
IdleMan
回复 @符冬 : 历史数据什么的最好了,还保护数据
符冬
符冬
@红薯 这样不太好,除非写完数据以后表里面的数据不再变动
红薯
红薯
先建普通表写入数据后在改呗
0
sami
sami
如果有只读字段就爽了
Oo努努
Oo努努
那别的字段可以insert,这个字段也不能insert,它就永远没有数据,你要它干神马。
0
草原小肥羊
草原小肥羊
不明白,如果表根本不能插入数据,所谓只读也没什么使用价值啊,求解
sunny_zhou
sunny_zhou
字典表
0
其荣
其荣
猜:表数据不是固定的,到了某个时刻固定了,就变为只读提高访问效率
0
camelwoo
camelwoo
刚还在想它和视图有什么不同,原来是为了提高效率。
0
aeolusj
aeolusj
ALTER TABLE READ_ONLY_TABLE3 READ ONLY ; 放在Insert之后是否可以在插入数据之后达到锁表(只读)的效果
0
产品哥
产品哥
这个感觉比较蛋疼。
返回顶部
顶部