Oracle 10g列掩码与关系视图比较

在前面的文章,我为大家介绍了如何使用Oracle 10g的虚拟私有数据库特征(VPD)掩藏某列数据TechRepublic的成员BrooklynPennyPincher建议我写一篇关于VPD与关系视图的比较文章。

前面文章中小技巧的任务是如果department_id的值等于60,那么掩藏报告中的salary和commission_pct列。因为谓词是一个静态值,所以一个关系视图肯定也能够完成同样的任务。

列表A显示了使用选择器CASE语句(这个语句在Oracle SQL的8i版本有了)比较depatment_id的值与60的关系的视图,如果相等返回NULL,如果是另外一个值则返回salary。一个类似的CASE语句也可以掩藏commission_pct列的数据。通过只授权访问视图而不是基本标(Employees)来保护数据。

但是如果我稍稍改变一下规则,要求掩藏除了用户本部门内的所有工资。这将会怎样?

你的第一想法可能是简单地创建更多的视图- -每个部门一个- -并且授予每个用户访问对应的视图的权限。有很多理由说明这不是一个好的解决方案,具体如下:

大量的视图可能增加维护负担(例如,如果一个改变了,所有其它的可能也需要改变)。新的部门可能要求新的视图,用户必须授予访问许可,当用户改变所在部门时,这些访问许可也必须改变。

视图中实现的查询可能是静态值,而不是绑定变量,因此大量同等重要的查询副本将存储在共享池中。

应用开发中必须为不同的用户调用不同的视图名,这也是复杂性的一个来源。

列表B对前面文章中的VPD策略函数进行了一些修改。取替直接比较部门号60,该示例中使用了SYS_CONTEXT函数来返回用户部门号(假设这个值在用户登录时设定),然后函数为不同的用户返回一个不同的断言(WHERE语句)。工资只在满足断言条件的行中显示,如果没有设定部门号,将返回始终为假的断言“1==2”,使得整个报告中的所有工资都被掩藏。

更加有利的是调用函数SYS_CONTEXT作为查询中一个绑定的变量,只有该查询的一个副本存储在共享池中来处理所有部门。

也可以使用SYS_CONTEXT函数以同样的方式构建关系视图,但是应用中的一个不同的视图将可能看到所有的数据。VPD方法将会过滤所有对Employees表的访问,而不管是哪个查询。

这是这两种方法的关键区别:视图设计用来过滤一个应用内的数据,而VPD设计用来允许大量用户组透明的共享同样的数据表,每个人只能看到他自己拥有的数据而不管是何应用。

CREATE OR REPLACE VIEW masked_salary_view

AS

SELECT first_name, last_name,
   CASE department_id
     WHEN 60 THEN NULL
     ELSE salary
   END AS salary,
   department_id

FROM employees

CREATE OR REPLACE 
FUNCTION rls_dept (obj_owner IN VARCHAR2, obj_name IN VARCHAR2)
RETURN VARCHAR2 
AS   deptno                       NUMBER;   predicate                    VARCHAR2(200);
BEGIN   deptno := SYS_CONTEXT('HR_CONTEXT','DEPT');   IF deptno IS NULL THEN      predicate := '1=2';   ELSE      predicate := 'department_id = '||deptno;   END IF;

RETURN (predicate);
END rls_dept;
/

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索数据
, 函数
, 视图
, 用户
, 一个
不同
oracle 10g 64位下载、oracle 10g、oracle 10g 32位下载、oracle10g安装图解、oracle10g 64位 网盘,以便于您获取更多的相关知识。

时间: 2024-09-10 23:09:00

Oracle 10g列掩码与关系视图比较的相关文章

查看oracle 10g 视图

oracle|视图 查看oracle 10g 视图   1.  查看数据库的名字和归档状态   SQL> select name,log_mode from v$database;   NAME      LOG_MODE --------- ------------ HB130000  ARCHIVELOG     2.  查看数据库的instance名字和状态   SQL> select instance_name,status from v$instance;   INSTANCE_NA

浅谈ORACLE 10G 闪回恢复区

oracle|恢复   何为闪回恢复区 Oracle 10g 有一项新功能称为:自动的基于磁盘的备份与恢复( Automatic Disk-Based Backup and Recovery ).实现该功能的基础为本文要讲述的闪回恢复区( Flash Recovery Area ).闪回恢复区是 Oracle 10g 中的新事物.简单的说,闪回恢复区是一块用以存储恢复相关的文件的存储空间.允许用户集中存储所有恢复相关的文件.   闪回恢复区可以放在如下几种存储形式上: l         目录

Oracle 10g中的闪回查询操作实例

与Oracle 9i相比Oracle 10g的Flashback有了非常大的改进,在Orcle 10g之前,SMON_SCN_TIME由SMON来获取和记录信息的,每5分钟记录一次,从Oracle 10g开始,LGWR首先会在SGA中记录SCN与时间的映射关系(由于LGWR至少每3秒就会被激活一次,所以现在SMON_SCN_TIME能够支持大于3秒的闪回),SMON则定期检查SGA是否内存中的映射大于磁盘上的,如果有就刷新纪录到磁盘, 而且从普通的Flashback Query发展到了多种形式,

oracle 9i 和oracle 10g 和oracle 11g区别

本文转自网络,其实这几个版本的内容有很多不同,本文只是做一个概括性说明,具体不同,我会在日后的博客中逐渐写出来. oracle 9i 和oracle 10g 和oracle 11g有什么区别??           简要说:     9i更易于管理. 详细说:     并发集群,8i OPS升级为9i RAC,8i结点间用硬盘交换信息,9i结点间采用高速网线的缓存熔合(Cache Fusion)技术交换信息,交换速度提高100倍以上.     9i可以在线修改内核参数和内存分配,8i不行.  

Oracle 10g(10.1.0.2)中的OPTIMIZER

oracle Oracle 10g(10.1.0.2)中的OPTIMIZER_INDEX_COST_ADJ Tom Kyte的新书Effective Oracle by Design的第6章 Getting the Most Out of the Cost-Based Optimizer中介绍了参数OPTIMIZER_INDEX_COST_ADJ,并认为可以理解为Oracle执行多块(MultiBlock)I/O(比如全表扫描)的代价与执行单块(Single-block)I/O代价的相对比例.T

Installing Oracle 10g on SuSE 9.1 professional

oracle   Oracle RDBMS | Weblogs | OpenSource | Reviews | Others [Oracle] Installing Oracle 10g on SuSE 9.1 professional 作者:Fenng 日期:July 03 2004 SuSE 9.1 专业版是前一段时间发布的.SuSE公司是欧洲的一个重要的Linux厂商.Suse Linux一直以界面华丽而著称.其实,SuSE Linux的一个很引人注目的地方就是对Oracle的支持一向不

Oracle 10G的Data Pump (Part I)

oracle Oracle 10G的Data Pump (Part I) 作者: Fenng出处: Http://www.DBAnotes.net Oracle 10G的Data Pump技术能够在不同数据库间高速的移动数据库和元数据. 这个技术的基础是两个数据移动工具:Data Pump Export和Data Pump Import. Oracle的Data Pump是通过一个PL/SQL包来实现的:DBMS_DataPump(也叫Data Pump API).Data Pump使用直接路径

教你安装Oracle 10g

今天在自己的电脑上安装了ORACLE 10g,现在介绍下自己的安装过程: 环境:OS: WIN 2000 Server MEM:250M(哈哈是有点小,安装时还有警告呢~) DB: ORACLE 10.2.0 1).可以到ORACLE的官方网站去下载她的安装压缩包:http://www.oracle.com/technology/global/cn/software/products/database/oracle10g/index.html 2).解压缩后就可以安装了.执行SETUP.EXE

linux下安装oracle 10g

在linux下安装oracle是一件令人生畏的事情,其复杂程度远远超过安装linux操作系统本身.如果能够进行成功的安装oracle,那么同时也就顺便掌握了linux一些技术.本文介绍在redhat linux 下安装oracle 10g 的方法.在这里说明一,Oracle 10g的g是grid 的缩写,意为网格,目前较为前沿的网络计算技术. Oracle 10g 对软硬件的要求都非常的高,所以要玩转的话的花不少银子.首先来看看它对硬件的要求:内存512兆(建议1G),cpu 主频2.0G以上,