Oracle11g新特性之只读表

 

    在Oracle 11g之前的版本中,若想对表设置只读,可以通过赋予SELECT对象权限给指定用户,但是表的拥有者仍然拥有读写权限。而Oracle 11g 允许通过ALTER  TABLE 命令将表标记为只读(read-only)。只读表跟普通的表没有区别,只是不允许任何事务对其执行任何 DML(Insert, Update, Delete) 操作。

测试环境

    我们在Oracle11g(11.2.0.3)进行测试。


点击(此处)折叠或打开

  1. SQL>

  2. SQL> select * from v$version;


  3. BANNER

  4. --------------------------------------------------------------------------------


  5. Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - Production

  6. PL/SQL Release 11.2.0.3.0 - Production

  7. CORE 11.2.0.3.0 Production

  8. TNS for Linux: Version 11.2.0.3.0 - Production

  9. NLSRTL Version 11.2.0.3.0 - Production


  10. SQL>



创建测试表

    我们创建一个测试表,命名为hoegh;然后,插入两条测试数据。

点击(此处)折叠或打开

  1. SQL>

  2. SQL> create table hoegh(id number,name varchar2(20));


  3. Table created.


  4. SQL> insert into hoegh values(1,'hoegh');


  5. 1 row created.


  6. SQL> insert into hoegh values(10,'hoegh');


  7. 1 row created.


  8. SQL> commit;


  9. Commit complete.


  10. SQL> select * from hoegh;


  11.         ID NAME

  12. ---------- --------------------


  13.          1 hoegh

  14.         10 hoegh


  15. SQL>

  16. SQL>


将普通表设为只读表

    我们通过alter table ... read only;语句来实现只读表;而且,我们可以通过数据字典视图 ALL_TABLES,DBA_TABLES,USER_TABLES,TABS)中的 READ_ONLY 列查询表的只读属性,如下所示:

点击(此处)折叠或打开

  1. SQL>

  2. SQL> alter table hoegh read only;


  3. Table altered.



  4. SQL>

  5. SQL> select table_name ,read_only from user_tables;


  6. TABLE_NAME REA

  7. ------------------------------ ---


  8. HOEGH YES


  9. SQL>


执行DML语句报错

    只读表不允许任何事务对其执行任何 DML(Insert, Update, Delete) 操作,否则系统会报ORA-12081错误,提示操作不被允许。

点击(此处)折叠或打开

  1. SQL>

  2. SQL> insert into hoegh values(100,'hoegh');

  3. insert into hoegh values(100,'hoegh')

  4.             *

  5. ERROR at line 1:

  6. ORA-12081: update operation not allowed on table "HOEGH"."HOEGH"



  7. SQL>

  8. SQL> update hoegh set id=100 where id=10;

  9. update hoegh set id=100 where id=10

  10.        *

  11. ERROR at line 1:

  12. ORA-12081: update operation not allowed on table "HOEGH"."HOEGH"



  13. SQL>

  14. SQL> delete from hoegh where id=10;

  15. delete from hoegh where id=10

  16.             *

  17. ERROR at line 1:

  18. ORA-12081: update operation not allowed on table "HOEGH"."HOEGH"



  19. SQL>



执行TRUNCATE语句报错

    只读表除了不能执行所有DML语句操作外,部分DDL语句也不能执行,比如TRUNCATE,否则系统同样会报ORA-12081错误,提示操作不被允许。

点击(此处)折叠或打开

  1. SQL>

  2. SQL> truncate table hoegh;

  3. truncate table hoegh

  4.                *

  5. ERROR at line 1:

  6. ORA-12081: update operation not allowed on table "HOEGH"."HOEGH"



  7. SQL>




执行DROP语句成功

    针对只读表的DROP操作,是被允许的。

点击(此处)折叠或打开

  1. SQL> drop table hoegh;


  2. Table dropped.


  3. SQL>


 

将只读表设为普通表

    我们通过alter table ... read write;语句来实现将只读表设为普通读写表。参看下面SQL语句:

点击(此处)折叠或打开

  1. SQL>

  2. SQL> alter table hoegh read write;


  3. Table altered.


  4. SQL> select table_name ,read_only from user_tables;


  5. TABLE_NAME REA

  6. ------------------------------ ---


  7. HOEGH NO


  8. SQL>

  9. SQL> insert into hoegh values(100,'hoegh');


  10. 1 row created.


  11. SQL> commit;


  12. Commit complete.


  13. SQL> update hoegh set id=11 where id=10;


  14. 1 row updated.


  15. SQL> commit;


  16. Commit complete.


  17. SQL> select * from hoegh;


  18.         ID NAME

  19. ---------- --------------------


  20.          1 hoegh

  21.         11 hoegh

  22.        100 hoegh


  23. SQL>


hoegh
15.8.4
-- The End --



请使用浏览器的分享功能分享到微信等