Oracle 10g实现只读表的N种方法(2)

ORA-25128报错
    此时,如果我们对linuxidc表进行DML操作,系统就会报ORA-25128错误,提示“不能对带有禁用和验证约束条件  的表进行插入/更新/删除”。


SQL> insert into linuxidc values(100,'linuxidc');

insert into linuxidc values(100,'linuxidc')
*
第 1 行出现错误:
ORA-25128: 不能对带有禁用和验证约束条件 (linuxidc.READ_ONLY_CONST) 的表进行插入/更新/删除 
 
SQL>

方法四:只读表空间
    设置只读表空间的主要目的是为了表空间中的静态数据不被修改,从而能够进行数据库的备份和恢复等操作,还能够保护只读表空间中的数据不被修改。

设置只读表空间的语法:ALTER TABLESPACE <表空间> READ ONLY;
将表空间设置为读写的语法:ALTER TABLESPACE <表空间> READ WRITE;
    由上面创建测试用户的语句我们得知,linuxidc用户的默认表空间是users,因此我们将users表空间设为只读表空间。这样,linuxidc用户下的所有表都将会是只读表,包括linuxidc表。
    如下所示。

SQL> show user

USER 为 "linuxidc"
SQL> alter table linuxidc drop constraint READ_ONLY_CONST;
 
表已更改。
 
SQL>
SQL> conn sys/linuxidc as sysdba
已连接。
SQL>
SQL> alter tablespace users read only;
 
表空间已更改。
 
SQL>
SQL> conn linuxidc/hoegh
已连接。
SQL> select * from linuxidc;
 
        ID NAME
---------- --------------------
        1 linuxidc 
        10 linuxidc 
 

ORA-00372& ORA-01110报错
    此时,如果我们对linuxidc表进行DML操作,系统就会报ORA-00372& ORA-01110错误,提示无法修改数据文件。
 

SQL>

SQL> insert into linuxidc values(100,'linuxidc');
insert into linuxidc values(100,'linuxidc')
            *
第 1 行出现错误:
ORA-00372: 此时无法修改文件 4
ORA-01110: 数据文件 4: 'E:\ATSTEST\USERS01.DBF' 
 
SQL>

DROP操作不受影响
    需要注意的是,只读表空间下是可以执行DROP操作的。

我们知道,每个数据库在运行的时候,都至少会有一个ONLINE表空间,那就是SYSTEM表空间,其中保存了数据字典以及PLSQL中的存储过程、触发器、函数、包等等数据库对象。当进行DDL进行数据库的删除操作的时候,本质是是操作的SYSTEM表空间,ORACLE会在SYSTEM存储的数据字典中,将删除的表设置为DROP状态,等该表空间的状态变成READ WRITE状态的时候,才会真正的从数据库里面删除该表。

方法五: 只读数据库
    当一个正常打开的数据库被设置为只读状态时,用户只能查询数据,但不能以任何方式对数据库对象进行修改。处于只读状态,可能保证数据文件和重做日志文件中的内容不被修改,但是并不限制那些不会写入数据文件与重做日志文件的操作。

设置只读命令:alter database open read only;

取消只读命令:alter database open read write;

SQL>

SQL> conn sys/linuxidc as sysdba
已连接。
SQL> alter tablespace users read write;
 
表空间已更改。
 
SQL>
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL>
SQL> startup mount
ORACLE 例程已经启动。
 
Total System Global Area 1258291200 bytes
Fixed Size 2163712 bytes
Variable Size 360446976 bytes
Database Buffers 889192448 bytes
Redo Buffers 6488064 bytes
数据库装载完毕。
SQL>
SQL> alter database open read only;
 
数据库已更改。
 
SQL>
SQL> conn linuxidc/hoegh
已连接。
SQL>
SQL> select * from linuxidc;
 
        ID NAME
---------- --------------------
        1 linuxidc 
        10 linuxidc 
 

ORA-01552报错
  此时,如果我们对linuxidc表进行DML操作,系统就会报ORA-01552错误,提示非系统表空间 'USERS' 不能使用系统回退段。
 

SQL>

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/c2f993d5cc7e5973e4aa608ffcbe46bd.html