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

有时为了提高数据的安全性,我们需要把一个或多个表设置为只读,即不允许对其执行任何 DML(Insert, Update, Delete) 操作。

测试环境
    我们在Oracle 10g+Windows Server 2008 Standard R2进行测试。

SQL>

SQL> select * from v$version;
 
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi
PL/SQL Release 10.2.0.4.0 - Production
CORE 10.2.0.4.0 Production
TNS for 64-bit Windows: Version 10.2.0.4.0 - Production
NLSRTL Version 10.2.0.4.0 - Production
 
SQL>
 

SQL>

SQL>

创建触发器
 

SQL>

方法三:检查约束
    我们知道对constraint的开启和关闭共有四种:

  1. enable( validate) :启用约束,创建索引,对已有及新加入的数据执行约束。
  2. enable novalidate :启用约束,创建索引,仅对新加入的数据强制执行约束,而不管表中的现有数据。
  3. disable( novalidate):关闭约束,删除索引,可以对约束列的数据进行修改等操作。
  4. disable validate :关闭约束,删除索引,不能对表进行 插入/更新/删除等操作。

因此,我们可以利用disable validate来实现只读表。

如下所示:

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

SQL> show user

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>

当然,这只是一个实现手段,我们肯定不会为了设置一个只读表而将整个数据库设置为只读状态。

总结
    上面这几种办法都可以实现将一个表设置为只读表,大家可以根据各自的具体需求选用最合适的方法。比如,最近我们一个项目为了提高数据的安全性,需要将配置数据(多张表)设置为只读表;并且,当初为了管理方便,所有的配置数据存放到一个单独的表空间,这样,我就会选用只读表空间的方法来实现这个具体需求。

猜你喜欢

转载自www.linuxidc.com/Linux/2015-08/121124.htm
今日推荐