天天看點

Oracle11新特性——線上操作功能增強(五)

打算寫一系列的文章介紹11g的新特性和變化。

11g中線上處理功能得到了很大增強,其中包括線上修改表結構,線上建立或重建索引,建立不可見索引,表增加非空字段,線上DDL以及對象依賴性細化等。

這一篇介紹Oracle11g的隻讀表功能。

Oracle11新特性——線上操作功能增強(一):http://yangtingkun.itpub.net/post/468/400430

Oracle11新特性——線上操作功能增強(二):http://yangtingkun.itpub.net/post/468/401293

Oracle11新特性——線上操作功能增強(三):http://yangtingkun.itpub.net/post/468/401641

Oracle11新特性——線上操作功能增強(四):http://yangtingkun.itpub.net/post/468/402220

在11g以前,Oracle提供的隻讀功能隻到了資料庫級和表空間級:

SQL> CONN / AS SYSDBA

Connected.

SQL> SHUTDOWN IMMEDIATE

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> STARTUP OPEN READ ONLY

ORACLE instance started.

Total System Global Area 267825152 bytes

Fixed Size 1299316 bytes

Variable Size 176163980 bytes

Database Buffers 88080384 bytes

Redo Buffers 2281472 bytes

Database mounted.

Database opened.

SQL> INSERT INTO YANGTK.T VALUES (2);

INSERT INTO YANGTK.T VALUES (2)

*

ERROR at line 1:

ORA-16000: database open for read-only access

如果資料庫級設定了隻讀打開,資料庫中任何對象都無法進行修改。

SQL> SHUTDOWN

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> STARTUP

ORACLE instance started.

Total System Global Area 267825152 bytes

Fixed Size 1299316 bytes

Variable Size 176163980 bytes

Database Buffers 88080384 bytes

Redo Buffers 2281472 bytes

Database mounted.

Database opened.

SQL> INSERT INTO YANGTK.T VALUES (2);

1 row created.

SQL> COMMIT;

Commit complete.

SQL> SELECT TABLESPACE_NAME FROM ALL_TABLES WHERE OWNER = 'YANGTK' AND TABLE_NAME = 'T';

TABLESPACE_NAME

------------------------------

YANGTK

SQL> ALTER TABLESPACE YANGTK READ ONLY;

Tablespace altered.

SQL> INSERT INTO YANGTK.T VALUES (3);

INSERT INTO YANGTK.T VALUES (3)

*

ERROR at line 1:

ORA-00372: file 5 cannot be modified at this time

ORA-01110: data file 5:

'/data/oracle/oradata/ora11g/ORA11G/datafile/o1_mf_yangtk_3d3kn7k4_.dbf'

設定表空間隻讀,那麼表空間中所有的對象都無法被修改。

也就是說,如果在11g之前,想要實作對某張表的隻讀,隻有建立一個表空間,将表放到該表空間中,再将表空間至于隻讀狀态。

不但操作麻煩,而且如果需要添加新的隻讀表,而不打算建立立一個表空間的話,需要先将隻讀表空間置為可寫,然後将新的表放進去,再将其置為隻讀,而在操作期間,表空間中原有的對象可能會被修改。

從11g開始,Oracle終于提供了表級的隻讀設定了,顯現方法也很簡單,一個ALTER TABLE READ ONLY語句就搞定了:

SQL> ALTER TABLESPACE YANGTK READ WRITE;

Tablespace altered.

SQL> CONN YANGTK/yangtk

Connected.

SQL> INSERT INTO T VALUES (3);

1 row created.

SQL> ALTER TABLE T READ ONLY;

Table altered.

SQL> INSERT INTO T VALUES (4);

INSERT INTO T VALUES (4)

*

ERROR at line 1:

ORA-12081: update operation not allowed on table "YANGTK"."T"

将表置于隻讀狀态,并非隻是禁止DML語句,包含FOR UPDATE的查詢語句,已經會引起表中資料發生變化的DDL語句都會被禁止。

而不影響表中資料的DDL則可以正常執行:

SQL> SELECT * FROM T;

ID

----------

1

2

3

SQL> SELECT * FROM T FOR UPDATE;

SELECT * FROM T FOR UPDATE

*

ERROR at line 1:

ORA-12081: update operation not allowed on table "YANGTK"."T"

SQL> ALTER TABLE T ADD NAME VARCHAR2(30);

ALTER TABLE T ADD NAME VARCHAR2(30)

*

ERROR at line 1:

ORA-12081: update operation not allowed on table "YANGTK"."T"

SQL> ALTER TABLE T MODIFY ID NOT NULL;

ALTER TABLE T MODIFY ID NOT NULL

*

ERROR at line 1:

ORA-12081: update operation not allowed on table "YANGTK"."T"

SQL> ALTER TABLE T ALLOCATE EXTENT;

Table altered.

SQL> ALTER TABLE T CACHE;

Table altered.

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-69447/,如需轉載,請注明出處,否則将追究法律責任。

轉載于:http://blog.itpub.net/4227/viewspace-69447/