搜索
首页数据库mysql教程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>

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

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
mysql无法打开共享库怎么解决mysql无法打开共享库怎么解决Mar 04, 2025 pm 04:01 PM

本文介绍了MySQL的“无法打开共享库”错误。 该问题源于MySQL无法找到必要的共享库(.SO/.DLL文件)。解决方案涉及通过系统软件包M验证库安装

减少在Docker中使用MySQL内存的使用减少在Docker中使用MySQL内存的使用Mar 04, 2025 pm 03:52 PM

本文探讨了Docker中的优化MySQL内存使用量。 它讨论了监视技术(Docker统计,性能架构,外部工具)和配置策略。 其中包括Docker内存限制,交换和cgroups

如何使用Alter Table语句在MySQL中更改表?如何使用Alter Table语句在MySQL中更改表?Mar 19, 2025 pm 03:51 PM

本文讨论了使用MySQL的Alter Table语句修改表,包括添加/删除列,重命名表/列以及更改列数据类型。

在 Linux 中运行 MySQl(有/没有带有 phpmyadmin 的 podman 容器)在 Linux 中运行 MySQl(有/没有带有 phpmyadmin 的 podman 容器)Mar 04, 2025 pm 03:54 PM

本文比较使用/不使用PhpMyAdmin的Podman容器直接在Linux上安装MySQL。 它详细介绍了每种方法的安装步骤,强调了Podman在孤立,可移植性和可重复性方面的优势,还

什么是 SQLite?全面概述什么是 SQLite?全面概述Mar 04, 2025 pm 03:55 PM

本文提供了SQLite的全面概述,SQLite是一个独立的,无服务器的关系数据库。 它详细介绍了SQLite的优势(简单,可移植性,易用性)和缺点(并发限制,可伸缩性挑战)。 c

如何为MySQL连接配置SSL/TLS加密?如何为MySQL连接配置SSL/TLS加密?Mar 18, 2025 pm 12:01 PM

文章讨论了为MySQL配置SSL/TLS加密,包括证书生成和验证。主要问题是使用自签名证书的安全含义。[角色计数:159]

在MacOS上运行多个MySQL版本:逐步指南在MacOS上运行多个MySQL版本:逐步指南Mar 04, 2025 pm 03:49 PM

本指南展示了使用自制在MacOS上安装和管理多个MySQL版本。 它强调使用自制装置隔离安装,以防止冲突。 本文详细详细介绍了安装,起始/停止服务和最佳PRA

哪些流行的MySQL GUI工具(例如MySQL Workbench,PhpMyAdmin)是什么?哪些流行的MySQL GUI工具(例如MySQL Workbench,PhpMyAdmin)是什么?Mar 21, 2025 pm 06:28 PM

文章讨论了流行的MySQL GUI工具,例如MySQL Workbench和PhpMyAdmin,比较了它们对初学者和高级用户的功能和适合性。[159个字符]

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前By尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
1 个月前By尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
4 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )专业的PHP集成开发工具

Atom编辑器mac版下载

Atom编辑器mac版下载

最流行的的开源编辑器

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

将Eclipse与SAP NetWeaver应用服务器集成。

EditPlus 中文破解版

EditPlus 中文破解版

体积小,语法高亮,不支持代码提示功能