? ? 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状态的时候,才会真正的从数据库里面删除该表。
方法五: 只读数据库
? ? 当一个正常打开的数据库被设置为只读状态时,用户只能查询数据,但不能以任何方式对数据库对象进行修改。处于只读状态,可能保证数据文件和重做日志文件中的内容不被修改,但是并不限制那些不会写入数据文件与重做日志文件的操作。
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>
SQL> insert into linuxidc values(100,'linuxidc');
insert into linuxidc values(100,'linuxidc')
? ? ? ? ? ? *
第 1 行出现错误:
ORA-01552: 非系统表空间 'USERS' 不能使用系统回退段
?
?
SQL>
?
当然,这只是一个实现手段,我们肯定不会为了设置一个只读表而将整个数据库设置为只读状态。
总结
? ? 上面这几种办法都可以实现将一个表设置为只读表,大家可以根据各自的具体需求选用最合适的方法。比如,最近我们一个项目为了提高数据的安全性,需要将配置数据(多张表)设置为只读表;并且,当初为了管理方便,所有的配置???据存放到一个单独的表空间,这样,我就会选用只读表空间的方法来实现这个具体需求。