设为首页 加入收藏

TOP

Oracle 10g实现只读表的N种方法(一)
2015-08-31 19:59:48 来源: 作者: 【 】 浏览:64
Tags:Oracle 10g 实现 只读 方法

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


下面就介绍在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>


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


设置只读表空间的语法: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 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇利用MySQL-Proxy进行MySQL数据库.. 下一篇Oracle 11g新特性之只读表

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·常用meta整理 | 菜鸟 (2025-12-25 01:21:52)
·SQL HAVING 子句:深 (2025-12-25 01:21:47)
·SQL CREATE INDEX 语 (2025-12-25 01:21:45)
·Shell 传递参数 (2025-12-25 00:50:45)
·Linux echo 命令 - (2025-12-25 00:50:43)