在oracle 11g之前的版本中,若想对表设置只读,可以通过赋予select对象权限给指定用户,但是表的拥有者仍然拥有读写权限。而oracle 11g 允许通过alter table 命令将表标记为只读(read-only)。只读表跟普通的表没有区别,只是不允许任何事务对其执行任何 dml(insert, update, delete) 操作。
测试环境
我们在oracle11g(11.2.0.3)进行测试。
sql>
sql> select * from v$version;
banner
--------------------------------------------------------------------------------
oracle database 11g enterprise edition release 11.2.0.3.0 - production
pl/sql release 11.2.0.3.0 - production
core 11.2.0.3.0 production
tns for linux: version 11.2.0.3.0 - production
nlsrtl version 11.2.0.3.0 - production
sql>
创建测试表
我们创建一个测试表,命名为linuxidc;然后,插入两条测试数据。
sql>
sql> create table linuxidc(id number,name varchar2(20));
table created.
sql> insert into linuxidc values(1,'linuxidc');
1 row created.
sql> insert into linuxidc values(10,'linuxidc');
1 row created.
sql> commit;
commit complete.
sql> select * from linuxidc;
id name
---------- --------------------
1 linuxidc
10 linuxidc
sql>
sql>
将普通表设为只读表
我们通过alter table ... read only;语句来实现只读表;而且,我们可以通过数据字典视图 (all_tables,dba_tables,user_tables,tabs)中的 read_only 列查询表的只读属性,如下所示:
sql>
sql> alter table linuxidc read only;
table altered.
sql>
sql> select table_name ,read_only from user_tables;
table_name rea
------------------------------ ---
linuxidc yes
sql>
执行dml语句报错
只读表不允许任何事务对其执行任何 dml(insert, update, delete) 操作,否则系统会报ora-12081错误,提示操作不被允许。
sql>
sql> insert into linuxidc values(100,'linuxidc');
insert into linuxidc values(100,'linuxidc')
*
error at line 1:
ora-12081: update operation not allowed on table linuxidc.linuxidc
sql>
sql> update linuxidc set id=100 where id=10;
update linuxidc set id=100 where id=10
*
error at line 1:
ora-12081: update operation not allowed on table linuxidc.linuxidc
sql>
sql> delete from linuxidc where id=10;
delete from linuxidc where id=10
*
error at line 1:
ora-12081: update operation not allowed on table linuxidc.linuxidc
sql>
执行truncate语句报错
只读表除了不能执行所有dml语句操作外,,部分ddl语句也不能执行,比如truncate,否则系统同样会报ora-12081错误,提示操作不被允许。
sql>
sql> truncate table linuxidc;
truncate table linuxidc
*
error at line 1:
ora-12081: update operation not allowed on table linuxidc.linuxidc
sql>
执行drop语句成功
针对只读表的drop操作,是被允许的。
sql> drop table linuxidc;
table dropped.
sql>
将只读表设为普通表
我们通过alter table ... read write;语句来实现将只读表设为普通读写表。参看下面sql语句:
sql>
sql> alter table linuxidc read write;
table altered.
sql> select table_name ,read_only from user_tables;
table_name rea
------------------------------ ---
linuxidc no
sql>
sql> insert into linuxidc values(100,'linuxidc');
1 row created.
sql> commit;
commit complete.
sql> update linuxidc set id=11 where id=10;
1 row updated.
sql> commit;
commit complete.
sql> select * from linuxidc;
id name
---------- --------------------
1 linuxidc
11 linuxidc
100 linuxidc
sql>
本文永久更新链接地址: