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

yangtingkun發表於2007-10-04

打算寫一系列的文章介紹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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章