您好,欢迎访问一九零五行业门户网

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

有时为了提高数据的安全性,我们需要把一个或多个表设置为只读,即不允许对其执行任何 dml(insert, update, delete) 操作。在ora
有时为了提高数据的安全性,我们需要把一个或多个表设置为只读,即不允许对其执行任何 dml(insert, update, delete) 操作。
在oracle11g中实现只读表非常简单,只需要执行alter table ... read only;语句即可;但是在11g之前的版本,“只读”只对数据库和表空间有效,,如果我们要实现一个只读表,只能通过其他办法。
下面就介绍在oracle10g中实现只读表的几种常用方法。首先,我们先创建测试表linuxidc。
测试环境
    我们在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>
创建测试用户及测试表
    我们创建一个测试用户linuxidc,指定默认表空间为users;然后,在linuxidc用户下创建测试表,同样命名为linuxidc。
sql>
sql> create user linuxidc identified by linuxidc 
  2 default tablespace users;
用户已创建。
sql>
sql> grant connect,resource to linuxidc;
授权成功。
sql>
sql> conn linuxidc/hoegh
已连接。
sql>
sql> create table linuxidc(id number,name varchar2(20));
表已创建。
sql> insert into linuxidc values(1,'linuxidc');
已创建 1 行。
sql> insert into linuxidc values(10,'linuxidc');
已创建 1 行。
sql> commit;
提交完成。
sql> select * from linuxidc;
id name
---------- --------------------
        1 linuxidc 
        10 linuxidc
sql>
方法一:授予select权限
    该方法仅针对非属主用户。以linuxidc表为例,它的属主用户是linuxidc,我们可以把hoegh表的select权限赋予其他用户,这样其他用户对linuxidc表就是只读的。
sql>
sql> grant select on linuxidc to scott;
授权成功。
sql> conn scott/tiger
已连接。
sql> select * from linuxidc.hoegh;
id name
---------- --------------------
        1 linuxidc 
        10 linuxidc
sql>
ora-01031报错
    此时,如果我们对linuxidc.hoegh表进行dml操作,系统就会报ora-01031错误,提示权限不足。
sql> insert into linuxidc.hoegh values(100,'linuxidc');
insert into linuxidc.hoegh values(100,'linuxidc')
                  *
第 1 行出现错误:
ora-01031: 权限不足
sql>
方法二: 触发器
    我们可以在linuxidc表上创建一个触发器,当对linuxidc表执行dml操作时报错。如下所示。
创建触发器
sql> conn linuxidc/hoegh
已连接。
sql>
sql> create or replace trigger linuxidc_trg
  2 before delete or insert or update
  3 on linuxidc 
  4 referencing new as new old as old
  5 for each row
  6 declare
  7 begin
  8 raise_application_error (-20001, 'table is read only table.');
  9 end;
 10 /
触发器已创建
ora-20001报错
    此时,如果我们对linuxidc表进行dml操作,系统就会报ora-20001错误,提示“table is read only table”。
sql>
sql> insert into linuxidc values(100,'linuxidc');
insert into linuxidc values(100,'linuxidc')
            *
第 1 行出现错误:
ora-20001: table is read only table.
ora-06512: 在 linuxidc.hoegh_trg, line 3
ora-04088: 触发器 'linuxidc.hoegh_trg' 执行过程中出错
sql>
方法三:检查约束
    我们知道对constraint的开启和关闭共有四种:
因此,我们可以利用disable validate来实现只读表。
如下所示:
alter table linuxidc add constraint read_only_const check(0=0) disable validate;
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>
方法四:只读表空间
    设置只读表空间的主要目的是为了表空间中的静态数据不被修改,从而能够进行数据库的备份和恢复等操作,还能够保护只读表空间中的数据不被修改。
其它类似信息

推荐信息