[转帖]Oracle11g实现只读表方法
1.1 ALTER TABLE tab_name READ ONLY
参考:https://www.cnblogs.com/chinas/p/8440460.html
Oracle 11g开始支持设置某张表为只读,这样可以防范对某些表的修改,起到一定的安全性。
设置如下:
--设置表为只读权限(加锁)
ALTER TABLE tab_name READ ONLY ;
--设置表的读写权限(解锁)
ALTER TABLE tab_name READ WRITE ;
当表需要进行更新、增删记录时,可以重新设置读写权限,对表进行修改操作后,再次设置为只读属性。
拓展:在某些特定情况下,可能需要某张表的记录只能增加,不能删除,这怎样实现呢?
一种可供参考的方法是对这张表加上触发器,当对表进行更新、删除等操作时,触发抛出异常,进行insert时,不触发异常。
1.2 建立只读用户
参考:https://blog.csdn.net/woaixiaoyu520/article/details/76690864
场景:数据库dbtest(服务名)下,创建reader只读用户访问查询scott普通用户下的表及数据
这里先只介绍使用命令操作的一种方法
1. 管理员权限登陆sqlplus
打开cmd,登陆方法命令很多,例如:
sqlplus scott/tiger@dbtest as sysdba
或者 sqlplus / as sysdba 之类命令进入sqlplus
然后conn scott/tiger@dbtest as sysdba
2. 创建一个新用户reader,密码123456
create user reader identified by 123456;
3. 为reader用户赋权限
/** 连接权限 */
grant connect to reader;
/** 创建同义词权限 */
grant create synonym to reader;
4. 为reader用户赋查询表权限
为查询指定表”table1”赋权
grant select on scott.table1 to reader;
为查询所有表赋权
下面的sql语句是用来生成批量执行语句的,生成的语句全部执行后即可完成对reader进行所有表查询权限的赋权
select 'grant select on '||owner||'.'||object_name||' to reader;'
from dba_objects
where owner in ('SCOTT') and object_type='TABLE';
5. 为reader创建同义词
前面已经为reader用户赋了创建同义词的权限,可以登陆reader用户直接创建,当然也可以在管理员用户下创建;如果不创建同义词,那么reader用户查询表时,必须使用scott.table1这类的写法
为指定表”table1”创建同义词
create or replace synonym reader.table1 for scott.table1;
为所有表创建同义词
下面的sql语句是用来生成批量执行语句的,生成的语句全部执行后即可完成对所有表创建同义词,由于这里用到管理员权限才能查询到的内容,因此执行这个需要管理员权限
select 'create or replace synonym reader.'||object_name||' for '||owner||'.'||object_name||';'
from dba_objects
where owner in ('SCOTT') and object_type='TABLE';
5. 测试reader只读权限
接下来就可以使用sql进行reader用户的操作了
下面就介绍在Oracle10g中实现只读表的几种常用方法。首先,我们先创建测试表hoegh。
1.3 其他
参考:http://blog.itpub.net/30162081/viewspace-1761805/
测试环境
我们在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>
创建测试用户及测试表
我们创建一个测试用户hoegh,指定默认表空间为users;然后,在hoegh用户下创建测试表,同样命名为hoegh。
SQL>
SQL> create user hoegh identified by hoegh
2 default tablespace users;
用户已创建。
SQL>
SQL> grant connect,resource to hoegh;
授权成功。
SQL>
SQL> conn hoegh/hoegh
已连接。
SQL>
SQL> create table hoegh(id number,name varchar2(20));
表已创建。
SQL> insert into hoegh values(1,'hoegh');
已创建 1 行。
SQL> insert into hoegh values(10,'hoegh');
已创建 1 行。
SQL> commit;
提交完成。
SQL> select * from hoegh;
ID NAME
---------- --------------------
1 hoegh
10 hoegh
SQL>
1.3.1 授予Select权限
该方法仅针对非属主用户。以hoegh表为例,它的属主用户是hoegh,我们可以把hoegh表的select权限赋予其他用户,这样其他用户对hoegh表就是只读的。
SQL>
SQL> grant select on hoegh to scott;
授权成功。
SQL> conn scott/tiger
已连接。
SQL> select * from hoegh.hoegh;
ID NAME
---------- --------------------
1 hoegh
10 hoegh
SQL>
ORA-01031报错
此时,如果我们对hoegh.hoegh表进行DML操作,系统就会报ORA-01031错误,提示权限不足。
SQL> insert into hoegh.hoegh values(100,'hoegh');
insert into hoegh.hoegh values(100,'hoegh')
第 1 行出现错误:
ORA-01031: 权限不足
SQL>
1.3.2 触发器
我们可以在hoegh表上创建一个触发器,当对hoegh表执行DML操作时报错。如下所示。
创建触发器
SQL> conn hoegh/hoegh
已连接。
SQL>
SQL> CREATE OR REPLACE TRIGGER HOEGH_TRG
2 BEFORE DELETE OR INSERT OR UPDATE
3 ON HOEGH
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报错
此时,如果我们对hoegh表进行DML操作,系统就会报ORA-20001错误,提示“Table is read only table”。
SQL>
SQL> insert into hoegh values(100,'hoegh');
insert into hoegh values(100,'hoegh')
*
第 1 行出现错误:
ORA-20001: Table is read only table.
ORA-06512: 在 "HOEGH.HOEGH_TRG", line 3
ORA-04088: 触发器 'HOEGH.HOEGH_TRG' 执行过程中出错
SQL>
1.3.3 检查约束
我们知道对constraint的开启和关闭共有四种:
l enable( validate) :启用约束,创建索引,对已有及新加入的数据执行约束。
l enable novalidate :启用约束,创建索引,仅对新加入的数据强制执行约束,而不管表中的现有数据。
l disable( novalidate):关闭约束,删除索引,可以对约束列的数据进行修改等操作。
l disable validate :关闭约束,删除索引,不能对表进行 插入/更新/删除等操作。
因此,我们可以利用disable validate来实现只读表。
如下所示:
ALTER TABLE HOEGH ADD CONSTRAINT READ_ONLY_CONST CHECK(0=0) DISABLE VALIDATE;
ORA-25128报错
此时,如果我们对hoegh表进行DML操作,系统就会报ORA-25128错误,提示“不能对带有禁用和验证约束条件 的表进行插入/更新/删除”。
SQL> insert into hoegh values(100,'hoegh');
insert into hoegh values(100,'hoegh')
*
第 1 行出现错误:
ORA-25128: 不能对带有禁用和验证约束条件 (HOEGH.READ_ONLY_CONST) 的表进行插入/更新/删除
SQL>
1.3.4 只读表空间
设置只读表空间的主要目的是为了表空间中的静态数据不被修改,从而能够进行数据库的备份和恢复等操作,还能够保护只读表空间中的数据不被修改。
设置只读表空间的语法:ALTER TABLESPACE <表空间> READ ONLY;
将表空间设置为读写的语法:ALTER TABLESPACE <表空间> READ WRITE;
由上面创建测试用户的语句我们得知,hoegh用户的默认表空间是users,因此我们将users表空间设为只读表空间。这样,hoegh用户下的所有表都将会是只读表,包括hoegh表。
如下所示。
SQL> show user
USER 为 "HOEGH"
SQL> alter table hoegh drop constraint READ_ONLY_CONST;
表已更改。
SQL>
SQL> conn sys/hoegh as sysdba
已连接。
SQL>
SQL> alter tablespace users read only;
表空间已更改。
SQL>
SQL> conn hoegh/hoegh
已连接。
SQL> select * from hoegh;
ID NAME
---------- --------------------
1 hoegh
10 hoegh
ORA-00372& ORA-01110报错
此时,如果我们对hoegh表进行DML操作,系统就会报ORA-00372& ORA-01110错误,提示无法修改数据文件。
SQL>
SQL> insert into hoegh values(100,'hoegh');
insert into hoegh values(100,'hoegh')
*
第 1 行出现错误:
ORA-00372: 此时无法修改文件 4
ORA-01110: 数据文件 4: 'E:\ATSTEST\USERS01.DBF'
SQL>
DROP操作不受影响
需要注意的是,只读表空间下是可以执行DROP操作的。
我们知道,每个数据库在运行的时候,都至少会有一个ONLINE表空间,那就是SYSTEM表空间,其中保存了数据字典以及PLSQL中的存储过程、触发器、函数、包等等数据库对象。当进行DDL进行数据库的删除操作的时候,本质是是操作的SYSTEM表空间,ORACLE会在SYSTEM存储的数据字典中,将删除的表设置为DROP状态,等该表空间的状态变成READ WRITE状态的时候,才会真正的从数据库里面删除该表。
1.3.4 只读数据库
当一个正常打开的数据库被设置为只读状态时,用户只能查询数据,但不能以任何方式对数据库对象进行修改。处于只读状态,可能保证数据文件和重做日志文件中的内容不被修改,但是并不限制那些不会写入数据文件与重做日志文件的操作。
l 设置只读命令:alter database open read only;
l 取消只读命令:alter database open read write;
SQL>
SQL> conn sys/hoegh 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 hoegh/hoegh
已连接。
SQL>
SQL> select * from hoegh;
ID NAME
---------- --------------------
1 hoegh
10 hoegh
ORA-01552报错
此时,如果我们对hoegh表进行DML操作,系统就会报ORA-01552错误,提示非系统表空间 'USERS' 不能使用系统回退段。
SQL>
SQL> insert into hoegh values(100,'hoegh');
insert into hoegh values(100,'hoegh')
*
第 1 行出现错误:
ORA-01552: 非系统表空间 'USERS' 不能使用系统回退段
SQL>
当然,这只是一个实现手段,我们肯定不会为了设置一个只读表而将整个数据库设置为只读状态。
总结
上面这几种办法都可以实现将一个表设置为只读表,大家可以根据各自的具体需求选用最合适的方法。比如,最近我们一个项目为了提高数据的安全性,需要将配置数据(多张表)设置为只读表;并且,当初为了管理方便,所有的配置数据存放到一个单独的表空间,这样,我就会选用只读表空间的方法来实现这个具体需求。
</article>
[转帖]Oracle11g实现只读表方法的更多相关文章
- Oracle11g导出空表
# Oracle11g导出空表 <!-- create time: 2015-06-01 23:35:24 --> ###原因 11G中有个新特性,当表无数据时,不分配`segment`, ...
- 利用__index和__newindex实现默认值表、监控表、只读表
__index和__newindex实际上相当于是在读写表的时候分别加了一道过滤的逻辑,让读写表的操作可以被监控或说回调,利用这个特性可以实现一些带有特殊功能的表. 带有默认值的表: setdefau ...
- 利用__index和__newindex实现默认值表、监控表、只读表(转)
__index和__newindex实际上相当于是在读写表的时候分别加了一道过滤的逻辑,让读写表的操作可以被监控或说回调,利用这个特性可以实现一些带有特殊功能的表. 带有默认值的表: setdefau ...
- Lua只读表
利用Lua的元表(metatable)和元函数(metafunction)可以很简单的实现此功能. 其实现大致分为三个部分 1.禁止在表中创建新值 2.禁止改变已有的值 3.将子表也变为只读 1.禁止 ...
- sap透明表、结构、簇介绍以及查找表方法
sap透明表.结构.簇介绍以及查找表方法 一些人在写开发功能说明书的时候不知道如何去找屏幕字段对应的透明表,下面我来介绍一个比较有效的方法:首先简单介绍一下概念:在SAP中的表的种类有以下三种:Tra ...
- ASP.NET导出excel表方法汇总
asp.net里导出excel表方法汇总 1.由dataset生成 public void CreateExcel(DataSet ds,string typeid,string FileName) ...
- mysql分表方法-----MRG_MyISAM引擎分表法
一般来说,当我们的数据库的数据超过了100w记录的时候就应该考虑分表或者分区了,这次我来具体说说分表的一些方法.眼下我所知道的方法都是MYISAM的,INNODB怎样做分表而且保留事务和外键,我还不是 ...
- mysql分表方法实现
一般来说,当我们的数据库的数据超过了100w记录的时候就应该考虑分表或者分区了,这次我来详细说说分表的一些方法.目前我所知道的方法都是MYISAM的,INNODB如何做分表并且保留事务和外键,我还不是 ...
- 解决Linux文件系统变成只读的方法
解决Linux文件系统变成只读的方法 解决方法 1.重启看是否可以修复(很多机器可以) 2.使用用 fsck – y /dev/hdc6 (/dev/hdc6指你需要修复的分区) 来修复文件系统 ...
- Oracle11g手动创建数据库方法
Oracle11g手动创建数据库方法 参考网页http://www.th7.cn/db/Oracle/201311/36926.shtml 安装路径 我的安装路径是:E:\app\admin\prod ...
随机推荐
- 编写.NET的Dockerfile文件构建镜像
创建一个WebApi项目,并且创建一个Dockerfile空文件,添加以下代码,7.0代表的你项目使用的SDK的版本,构建的时候也需要选择好指定的镜像tag FROM mcr.microsoft.co ...
- Spring Boot入坑-1-入坑准备&Spring简介
[写在前面] 长期做基于Spring Boot的企业应用,计划将与应用相关的技术点,通过简介.步骤.示例的方式,记录并分享出来,用于作为Spring Boot入门的记录与教程 计划的内容有: Spri ...
- ChatGPT的中转站 oupuapi,不扶墙也能上楼
我们在建类似 chatgpt 聊天站点的时候,只需对服务器进行扶墙代理,便可实现访问. 那么我们只需要往深里想一下,不要让整个服务器去访问 VPN,而是基于 API 的代理,或者说 API 的中转站也 ...
- 占位图片(Placeholder Image)
一.引言 在网页设计和开发中,占位图片(Placeholder Image)是一种常见的技术手段,用于在用户上传图片之前或者图片加载失败时,展示一个临时替代的图片,以提高用户体验.本文将详细介绍占位图 ...
- Spring Boot3 系列:Spring Boot3 跨域配置 Cors
目录 什么是CORS? Spring Boot 如何配置CORS? 前端代码 注解配置 全局配置 过滤器配置 注意事项 什么是CORS? CORS,全称是"跨源资源共享"(Cros ...
- AI如何提升10倍筛药效率?6月18日华为云携手中科院上海药物所揭开谜底
摘要:6月18日,华为云TechWave全球技术峰会(人工智能&数据)围绕人工智能.大数据.数据库.华为云Stack等热点话题,携手来自全球的IT精英.技术大咖.先锋企业.合作伙伴共话前沿技术 ...
- 经典永流传,华为云媒体 AI 让老电影焕发新生
摘要:近日,在华为云TechWave全球技术峰会(人工智能&数据)上,马栏山视频文创产业园首席专家周苏岳受邀发表演讲<经典永流传,媒体 AI 让老电影焕发新生>,分享与华为云原生媒 ...
- 互斥锁Mutex:鸿蒙轻内核中处理临界资源独占的“法官”
摘要:本文带领大家一起剖析鸿蒙轻内核的互斥锁模块的源代码,包含互斥锁的结构体.互斥锁池初始化.互斥锁创建删除.申请释放等. 本文分享自华为云社区<鸿蒙轻内核M核源码分析系列十 互斥锁Mutex& ...
- 详解SQL优化必备:并行执行框架和执行计划
摘要:在关系型数据库中,优化器是数据库的核心组件之一,由于一些列因素都会影响语句的执行,优化器综合权衡各个因素,在众多的执行计划中选择认为是最佳的执行计划. 本文分享自华为云社区<华为云Gaus ...
- 探索开源工作流引擎Azkaban在MRS中的实践
摘要:本文主要介绍如何在华为云上从0-1搭建azkaban并指导用户如何提交作业至MRS. 本文分享自华为云社区<开源工作流引擎Azkaban在MRS中的实践>,作者:啊喔YeYe. 环境 ...