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实现只读表方法的更多相关文章

  1. Oracle11g导出空表

    # Oracle11g导出空表 <!-- create time: 2015-06-01 23:35:24 --> ###原因 11G中有个新特性,当表无数据时,不分配`segment`, ...

  2. 利用__index和__newindex实现默认值表、监控表、只读表

    __index和__newindex实际上相当于是在读写表的时候分别加了一道过滤的逻辑,让读写表的操作可以被监控或说回调,利用这个特性可以实现一些带有特殊功能的表. 带有默认值的表: setdefau ...

  3. 利用__index和__newindex实现默认值表、监控表、只读表(转)

    __index和__newindex实际上相当于是在读写表的时候分别加了一道过滤的逻辑,让读写表的操作可以被监控或说回调,利用这个特性可以实现一些带有特殊功能的表. 带有默认值的表: setdefau ...

  4. Lua只读表

    利用Lua的元表(metatable)和元函数(metafunction)可以很简单的实现此功能. 其实现大致分为三个部分 1.禁止在表中创建新值 2.禁止改变已有的值 3.将子表也变为只读 1.禁止 ...

  5. sap透明表、结构、簇介绍以及查找表方法

    sap透明表.结构.簇介绍以及查找表方法 一些人在写开发功能说明书的时候不知道如何去找屏幕字段对应的透明表,下面我来介绍一个比较有效的方法:首先简单介绍一下概念:在SAP中的表的种类有以下三种:Tra ...

  6. ASP.NET导出excel表方法汇总

    asp.net里导出excel表方法汇总  1.由dataset生成 public void CreateExcel(DataSet ds,string typeid,string FileName) ...

  7. mysql分表方法-----MRG_MyISAM引擎分表法

    一般来说,当我们的数据库的数据超过了100w记录的时候就应该考虑分表或者分区了,这次我来具体说说分表的一些方法.眼下我所知道的方法都是MYISAM的,INNODB怎样做分表而且保留事务和外键,我还不是 ...

  8. mysql分表方法实现

    一般来说,当我们的数据库的数据超过了100w记录的时候就应该考虑分表或者分区了,这次我来详细说说分表的一些方法.目前我所知道的方法都是MYISAM的,INNODB如何做分表并且保留事务和外键,我还不是 ...

  9. 解决Linux文件系统变成只读的方法

    解决Linux文件系统变成只读的方法   解决方法 1.重启看是否可以修复(很多机器可以) 2.使用用 fsck – y /dev/hdc6 (/dev/hdc6指你需要修复的分区) 来修复文件系统 ...

  10. Oracle11g手动创建数据库方法

    Oracle11g手动创建数据库方法 参考网页http://www.th7.cn/db/Oracle/201311/36926.shtml 安装路径 我的安装路径是:E:\app\admin\prod ...

随机推荐

  1. wangEditor出现初始化编辑器时候未传入任何参数,请查阅文档

    wangEditor出现初始化编辑器时候未传入任何参数,请查阅文档 出现的原因可能是你未在初始视图.元素未创建.created.模态框.弹窗.抽屉中使用,你应该在div元素创建了再执行初始渲染, 解决 ...

  2. PyTorch项目源码学习(2)——Tensor代码结构初步学习

    PyTorch版本:1.10.0 Tensor Tensor是Pytorch项目较为重要的一部分,其中的主要功能如存储,运算由C++和CUDA实现,本文主要从前端开始探索学习Tensor的代码结构. ...

  3. GitHub星标1k+的C#/.NET/.NET Core学习、工作、面试指南(让现在的自己不再迷茫✨)

    缘起 概述:发现现如今网上关于Java.前端.Android.Golang...等相关技术的学习资料,面试指南一搜都是一大把,但是我们大.NET/C#的相关学习资料,面试指南和一些常见的面试题都是寥寥 ...

  4. 18篇文章系统解读:中台规划如何撬动企业IT基础设施转型升级

    摘要:通过这个系列,让大家对中台的价值.针对的问题痛点.中台规划的方法思路和技巧.一些中台业务实践有个基本的认识,让客户清楚的意识到企业中台的业务价值,进而通过企业中台规划牵引客户IT基础设施投资. ...

  5. 跟我学丨如何用鲲鹏服务器搭建Hadoop全分布式集群

    摘要:今天教大家如何利用鲲鹏服务器搭建Hadoop全分布式集群,动起来··· 一.Hadoop常见的三种运行模式 1.单机模式(独立模式)(Local或Standalone Mode) 默认情况下Ha ...

  6. Python图像处理丨图像缩放、旋转、翻转与图像平移

    摘要:本篇文章主要讲解Python调用OpenCV实现图像位移操作.旋转和翻转效果,包括四部分知识:图像缩放.图像旋转.图像翻转.图像平移. 本文分享自华为云社区<[Python图像处理] 六. ...

  7. Jenkins Pipeline 流水线 - 拉代码(SVN) + Maven 编译打包

    Jenkins Pipeline 流水线 步骤 拉取SVN代码 -> Maven 构建 -> Docker 编译 -> 发布至阿里云仓库 -> K8S 更新 Jenkins插件 ...

  8. 【Java爬虫】如何通过 API 递归分页爬取网页数据

    前言 在最近的互联网项目开发中,需要获取用户的访问ip信息进行统计的需求,用户的访问方式可能会从微信内置浏览器.Windows浏览器等方式对产品进行访问. 当然,获取这些关于ip的信息是合法的.但是, ...

  9. Linux day2:文件和文件夹相关命令 文件内容编辑命令 Linux常用目录 Linux重要文件

    目录 问题说明 前期必备知识 系统运行命令 shutdown -c 快捷方式命令 ctrl+e 目录结构相关命令 mkdir -p 文件和文件夹相关命令 创建文件 touch 查看文件和目录 ls - ...

  10. Qt 如何配置CLion标准控制台输出?

    CMake 相关问题: 即CMakeLists.txt文件中,在add_executable添加了WIN32.即当使用了WIN32标识后,就去掉了控制台,那么自然就没有信息打印出来了. # for e ...