视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Oracle10g实现只读表的N种方法
2020-11-09 07:50:54 责编:小采
文档


有时为了提高数据的安全性,我们需要把一个或多个表设置为只读,即不允许对其执行任何 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 - bi
PL/SQL Release 10.2.0.4.0 - Production
CORE 10.2.0.4.0 Production
TNS for -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>

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

下载本文
显示全文
专题