溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Oracle 11g 新特性:只讀表(Read-only)

發(fā)布時間:2020-07-01 21:18:18 來源:網(wǎng)絡(luò) 閱讀:328 作者:艾弗森哇 欄目:關(guān)系型數(shù)據(jù)庫

Oracle11g推出了一個新的特性,可以將table置于read only狀態(tài),處于該狀態(tài)的table的不能執(zhí)行DML操作和某些DDL操作。在Oracle11g之前的版本,只能將整個tablespace或者database置于read only狀態(tài)。對于table的控制則只能通過權(quán)限來設(shè)定。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
CREATE?TABLE?products(prod_id?varchar2(6)?NOT?null,quantity?number,price?number,expiry_date?date);
ALTER?TABLE?products?READ?only;
TRUNCATE?TABLE?products;
ALTER?TABLE?products?SET?unused(expiry_date);
ALTER?TABLE?products?DROP??unused?columns;
CREATE?INDEX?idxxx?ON?products(price);
ALTER?TABLE?products?DROP?COLUMN?expiry_date;
DROP?TABLE?products;
HR@lhr121>?CREATE?TABLE?products(prod_id?varchar2(6)?NOT?null,quantity?number,price?number,expiry_date?date);
Table?created.
HR@lhr121>?HR@lhr121>?ALTER?TABLE?products?READ?only;
Table?altered.
HR@lhr121>?TRUNCATE?TABLE?products;
TRUNCATE?TABLE?products
???????????????*
ERROR?at?line?1:
ORA-12081:?update?operation?not?allowed?on?table?"HR"."PRODUCTS"
HR@lhr121>?ALTER?TABLE?products?SET?unused(expiry_date);
ALTER?TABLE?products?SET?unused(expiry_date)
*
ERROR?at?line?1:
ORA-12081:?update?operation?not?allowed?on?table?"HR"."PRODUCTS"
HR@lhr121>?ALTER?TABLE?products?DROP??unused?columns;
Table?altered.
HR@lhr121>?CREATE?INDEX?idxxx?ON?products(price);
Index?created.
HR@lhr121>?ALTER?TABLE?products?DROP?COLUMN?expiry_date;
ALTER?TABLE?products?DROP?COLUMN?expiry_date
*
ERROR?at?line?1:
ORA-12081:?update?operation?not?allowed?on?table?"HR"."PRODUCTS"
HR@lhr121>?DROP?TABLE?products;
Table?dropped.




案例分析:


11:44:46 SCOTT@ test1 >select * from tab;

TNAME? ? ? ? ? ? ? ? ? ? ? ? ? TABTYPE? CLUSTERID

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

BONUS? ? ? ? ? ? ? ? ? ? ? ? ? TABLE

CREDIT_CLUSTER? ? ? ? ? ? ? ? ?CLUSTER

CREDIT_ORDERS? ? ? ? ? ? ? ? ? TABLE? ? ? ? ? ? 1

DEPT? ? ? ? ? ? ? ? ? ? ? ? ? ?TABLE

EMP? ? ? ? ? ? ? ? ? ? ? ? ? ? TABLE

EMP1? ? ? ? ? ? ? ? ? ? ? ? ? ?TABLE


11:44:56 SCOTT@ test1 >select count(*) from emp1;

? COUNT(*)

----------

? ? ? ? 18

Elapsed: 00:00:00.04

11:45:12 SCOTT@ test1 >alter table emp1 read only;

Table altered.


11:51:46 SCOTT@ test1 >select read_only from user_tables where table_name='EMP1';

REA

---

YES


對只讀表做DML:

11:45:20 SCOTT@ test1 >insert into emp1 select * from emp where rownum=1;

insert into emp1 select * from emp where rownum=1

? ? ? ? ? ? *

ERROR at line 1:


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

Elapsed: 00:00:00.04

11:45:38 SCOTT@ test1 >delete from emp1;

delete from emp1

? ? ? ? ? ? *

ERROR at line 1:

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

Elapsed: 00:00:00.00

11:45:47 SCOTT@ test1 >update emp1 set sal=6000 where empno=7788;

update emp1 set sal=6000 where empno=7788

? ? ? ?*

ERROR at line 1:

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


TRUNCATE TABLE:

11:46:03 SCOTT@ test1 >truncate table emp1;

truncate table emp1

? ? ? ? ? ? ? ?*

ERROR at line 1:

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

Elapsed: 00:00:00.09


DROP TABLE:

11:46:45 SCOTT@ test1 >drop table emp1;

Table dropped.

Elapsed: 00:00:00.70

11:47:05 SCOTT@ test1 >show recycle;

ORIGINAL NAME? ? RECYCLEBIN NAME? ? ? ? ? ? ? ? OBJECT TYPE? DROP TIME

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

EMP1? ? ? ? ? ? ?BIN$ComP5WftmQ7gUKjA+QgIyQ==$0 TABLE? ? ? ? 2014-12-19:11:47:04

11:47:52 SCOTT@ test1 >flashback table emp1 to before drop;

Flashback complete.

11:49:56 SCOTT@ test1 >select count(*) from emp1;

? COUNT(*)

----------

? ? ? ? 18

? ? ? ??

MOVE TABLE:? ? ? ??

11:50:06 SCOTT@ test1 >alter table emp1 move;

Table altered.

Elapsed: 00:00:00.54


壓縮表:

11:51:27 SCOTT@ test1 >alter table emp1 compress;

Table altered.

Elapsed: 00:00:00.09

11:51:39 SCOTT@ test1 >alter table emp1 nocompress;

Table altered.

Elapsed: 00:00:00.16


約束管理:

11:52:53 SCOTT@ test1 >alter table emp1 add constraint fk_emp1 foreign key(deptno) references dept(deptno);

Table altered.


11:54:29 SCOTT@ test1 >alter table emp1 drop constraint fk_emp1;

Table altered.


11:54:47 SCOTT@ test1 >create index emp1_empno_ind on emp1(empno) tablespace indx;

Index created.


索引管理:

11:55:17 SCOTT@ test1 >drop index emp1_empno_ind;

Index dropped.


配置read write:

11:55:27 SCOTT@ test1 >alter table emp1 read write;

Table altered.


11:55:37 SCOTT@ test1 >select read_only from user_tables where table_name='EMP1';

REA

---

NO


在11g前的版本中,若想對表設(shè)置為只讀,可以通過賦予SELECT對象權(quán)限給這些用戶,但表的擁有者還是讀寫的。而Oracle 11g 允許表標(biāo)記為只讀(read-only)通過ALTER? TABLE 命令。

可以通過下面命令對表讀寫權(quán)限進(jìn)行設(shè)置:

? ALTER?? TABLE?? table_name READ ONLY;

? ALTER?? TABLE?? table_name READ WRITE;

簡單示例如下:

CREATE?? TABLE ro_test (

???? id? number

?);

INSERT?? INTO? ro_test ?VALUES (1);

ALTER? TABLE?? ro_test? READ ONLY;

?

任何影響表數(shù)據(jù)的DML語句和SELECT...FOR UPDATE查詢語句都返回ORA-12081錯誤信息

SQL> INSERT INTO ro_test?? VALUES (2);?
INSERT INTO ro_test?? VALUES (2)?
??????????? *?
ERROR at line 1:?
ORA-12081: update operation not allowed on table "TEST"."RO_TEST"


SQL> UPDATE ro_test?? SET id = 2;?
UPDATE ro_test?? SET id = 2?
?????? *?
ERROR at line 1:?
ORA-12081: update operation not allowed on table "TEST"."RO_TEST"

鄭州不孕不育醫(yī)院:http://yyk.39.net/zz3/zonghe/1d427.html

SQL> DELETE FROM ro_test;?
DELETE FROM ro_test?
??????????? *?
ERROR at line 1:?
ORA-12081: update operation not allowed on table "TEST"."RO_TEST"

影響表數(shù)據(jù)的DDL語句也受限制

SQL> TRUNCATE TABLE ro_test;?
TRUNCATE TABLE ro_test?
?????????????? *?
ERROR at line 1:?
ORA-12081: update operation not allowed on table "TEST"."RO_TEST"


SQL> ALTER TABLE ro_test ADD (description VARCHAR2(50));?
ALTER TABLE ro_test ADD (description VARCHAR2(50))?
*?
ERROR at line 1:?
ORA-12081: update operation not allowed on table "TEST"."RO_TEST"

表是只讀表但在與之相關(guān)的索引上操作不受影響。當(dāng)表切換回讀寫模式時DML和DDL操作恢復(fù)正常。

SQL> ALTER TABLE ro_test READ WRITE;

Table altered.

SQL> DELETE FROM ro_test;

1 row deleted.

SQL>


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI