Oracle11g推出了一个新的特性,可以将table置于read only状态,处于该状态的table的不能执行DML操作和某些DDL操作。在Oracle11g之前的版本,只能将整个tablespace或者database置于read only状态。对于table的控制则只能通过权限来设定。
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前的版本中,若想对表设置为只读,可以通过赋予SELECT对象权限给这些用户,但表的拥有者还是读写的。而Oracle 11g 允许表标记为只读(read-only)通过ALTER TABLE 命令。
可以通过下面命令对表读写权限进行设置:
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;
任何影响表数据的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"
SQL> DELETE FROM ro_test;
DELETE FROM ro_test
*
ERROR at line 1:
ORA-12081: update operation not allowed on table "TEST"."RO_TEST"
影响表数据的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"
表是只读表但在与之相关的索引上操作不受影响。当表切换回读写模式时DML和DDL操作恢复正常。
SQL> ALTER TABLE ro_test READ WRITE;
Table altered.
SQL> DELETE FROM ro_test;
1 row deleted.
SQL>
更多详细请查阅官方文档:
http://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_3001.htm
http://docs.oracle.com/cd/B28359_01/server.111/b28320/statviews_2105.htm
About Me
........................................................................................................................ ● 本文作者:小麦苗,部分内容整理自网络,若有侵权请联系小麦苗删除 ● 本文在itpub、博客园、CSDN和个人微 信公众号( xiaomaimiaolhr)上有同步更新 ● 本文itpub地址: http://blog.itpub.net/26736162 ● 本文博客园地址: http://www.cnblogs.com/lhrbest ● 本文CSDN地址: https://blog.csdn.net/lihuarongaini ● 本文pdf版、个人简介及小麦苗云盘地址: http://blog.itpub.net/26736162/viewspace-1624453/ ● 数据库笔试面试题库及解答: http://blog.itpub.net/26736162/viewspace-2134706/ ● DBA宝典今日头条号地址: http://www.toutiao.com/c/user/6401772890/#mid=1564638659405826 ........................................................................................................................ ● QQ群号: 230161599 、618766405 ● 微 信群:可加我微 信,我拉大家进群,非诚勿扰 ● 联系我请加QQ好友 ( 646634621 ),注明添加缘由 ● 于 2019-09-01 06:00 ~ 2019-09-31 24:00 在西安完成 ● 最新修改时间:2019-09-01 06:00 ~ 2019-09-31 24:00 ● 文章内容来源于小麦苗的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解 ● 版权所有,欢迎分享本文,转载请保留出处 ........................................................................................................................ ● 小麦苗的微店: https://weidian.com/s/793741433?wfr=c&ifr=shopdetail ● 小麦苗出版的数据库类丛书: http://blog.itpub.net/26736162/viewspace-2142121/ ● 小麦苗OCP、OCM、高可用网络班: http://blog.itpub.net/26736162/viewspace-2148098/ ● 小麦苗腾讯课堂主页: https://lhr.ke.qq.com/ ........................................................................................................................ 使用 微 信客户端扫描下面的二维码来关注小麦苗的微 信公众号( xiaomaimiaolhr)及QQ群(DBA宝典)、添加小麦苗微 信, 学习最实用的数据库技术。
........................................................................................................................ |