本文描述的是2005年在一个项目中采用Oracle VPD技术解决同一个OU下按照不同办事处屏蔽销售订单的解决方案。

VPD技术提供了数据库对象(表,同义词,视图)行级别访问的控制。关于VPD更多的信息不在此进行描述,有兴趣的同学可以查看Oracle Database Security Guide中的Using Virtual Private Database to Implement Application Security Policies章节。

一,业务需求

  1. 同一个OU下按照不同的办事处进行业务的操作
  2. 各办事处信息必须保证独立
  3. 办事处的人员只能对自己的客户下单

二,功能需求

由于上面的业务需求,以致需要有下面的功能需求

  1. 给不同的办事处设置不同的订单类型,并保证特定的订单类型只有特定的办事处所有,其它的订单类型为所有办事处拥有,对订单类型进行屏蔽
  2. 办事处只能使用自己的价目表来进行销售,需要对价目表进行办事处的屏蔽
  3. 办事处只能使用自己的客户及客户地址进行销售,需要对客户及客户地址进行屏蔽
  4. 办事处只能够查看和修改自己的订单信息,需要对销售订单进行屏蔽

三,技术方案

一般情况下,这样的需求在Oracle EBS二次开发中都会被认为是“不合理”的需求,如果顾问最终答应了这样的需求,对于开发人员首先会想到的就是修改相关的Form界面以及一些数据库视图的定义,但在Oracle EBS的二次开发规范中,最重要的一条原则就是不能修改标准功能的程序;而在这个案例中,即使我们修改了一些表面上的功能,如销售订单界面,客户信息查询等等,但是很有可能很多标准的报表或者程序都是没有进行相关屏蔽的,这样对于这项开发来说就是一个不可能完成的任务,也是一个风险非常大,以至于留下很多陷阱的开发。

这时候我想到要是有一个办法,能够从基表动态添加一个条件,将其按照办事处进行条件的筛选,那岂不是“釜底抽薪”,彻底解决了我的问题?

VPD通过安全策略(Policy)来动态返回一个条件(WHERE子句)来使得从行级别进行数据的屏蔽,将一个或多个安全策略与表或视图关联后,就实现了Oracle数据库的VPD功能。对带安全策略的表进行直接或间接访问时,数据库将调用一个实施该策略的函数,策略函数返回一个访问的条件(WHERE 子句),即谓词。应用程序将它附加到用户的 SQL 语句后面,从而动态修改用户的数据访问权限。

一般情况下,开发人员通过编写一个存储过程将 SQL 谓词附加到每个 SQL 语句(用于控制该语句的行级别访问权限)来实现VPD。VPD确保了无论用户以何种方式访问数据(通过应用程序、报表编写工具或SQL*Plus),都将强制实施访问权限控制策略,所以如果开发人员对oe_order_headers_all添加了一个“header_id > 1000 ”的条件谓词,那当任何程序以select * from oe_order_headers_all进行数据访问的时候,实际上真正运行的SQL语句则是select * from oe_order_headers_all WHERE header_id > 1000 ,因此通过动态生成WHERE谓词条件从而达到动态控制数据的安全。

下面是技术解决方案的主要步骤:

  1. 定义值集来维护办事处信息
  2. 定义一个预制文件来表明办事处身份
  3. 为每个办事处定义不同的职责,并将办事处的值分配给上面定义的预制文件
  4. 开启销售订单类型、价目表、客户和客户地址的描述性弹性域来记录办事处信息,将基础信息归类给各办事处,如果不设置办事处则表明所有办事处同时拥有,并写到个描述性弹性域段attribute1中(将这些基础数据按照办事处进行分类)
  5. 对销售订单类型、价目表、客户和客户地址的数据库表添加VPD安全策略,使attribute1字段受到办事处的限制(解决在销售订单界面或者其它地方引用这些对象是按照办事处屏蔽信息)
  6. 对销售订单头和行的表添加插入触发器,将办事处的信息写入 attribute1中,表明销售订单信息属于哪个办事处(解决录入数据的归属问题)?
  7. 对销售订单头和行的表添加VPD安全规则,使attribute1字段受到办事处的限制(解决订单查询时的屏蔽问题)

四,技术实现

很多技术的实现省略了,主要描述VPD策略如何实现:

首先是编写WHERE谓词条件:

? PLSQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
FUNCTION oe_order_header_predicate(
oowner IN VARCHAR2, ojname IN VARCHAR2) RETURN VARCHAR2 IS
l_branch_code VARCHAR2(10);
BEGIN   -- 得到办事处预制文件的值
l_branch_code := fnd_profile.VALUE('CUX_BRANCH_CODE')   -- if the responsibility not set the CUX_BRANCH_CODE profile's value
-- and all data are visible; otherwise, the data is restricted to profile
IF l_branch_code IS NOT NULL THEN
RETURN ('attribute1 = ' || l_branch_code ) ;
ELSE
RETURN ('1=1');
END IF;   END oe_order_header_predicate;

oe_order_header_predicate过程的两个参数类型是固定的,同时本文演示中将它放在cux_vpd_policy数据库包中

下面是注册VPD策略:

? PLSQL

1
2
3
4
5
6
7
8
BEGIN
dbms_rls.add_policy(
object_schema => 'apps',
object_name => 'oe_order_headers_all',
policy_name => 'bsm_oe_order_headers_rls1',
function_schema => 'apps',
policy_function => 'cux_vpd_policy.oe_order_header_predicate');
END;

上面只是演示了为销售订单头表添加VPD策略,其它的内容就留给读者自己来完成,如有任何问题或者更详细的内容,请提出来交流。

http://oracleseeker.com/2009/04/27/using_vpd_hide_information_in_oracle_ebs/

使用VPD解决EBS中信息屏蔽问题的更多相关文章

  1. 解决EBS中JAR包冲突的问题

    同事解决的,摘抄上来备用. 问题描述:在OAF里调用ESB的服务报错如下: Error Page   Exception Details.    oracle.apps.fnd.framework.O ...

  2. geotrellis使用(十六)使用缓冲区分析的方式解决投影变换中边缘数据值计算的问题

    Geotrellis系列文章链接地址http://www.cnblogs.com/shoufengwei/p/5619419.html 目录 前言 问题探索 采样说明 实现方案 总结 一.前言     ...

  3. 解决MyEclipse中的js报错的小方法

    今天,下了个模版,但是导进去的时候发现js会报错.看了下其他都没有错误.而有一个js报错误,请原谅我有点红色强迫症,不能留一点红色 . 错误如下:Syntax error on token " ...

  4. 解决struts2中UI标签出现的问题: The Struts dispatcher cannot be found

    解决struts2中UI标签出现的问题: The Struts dispatcher cannot be found 异常信息: The Struts dispatcher cannot be fou ...

  5. 如何解决FormView中实现DropDownList连动选择时出现 "Eval()、XPath() 和 Bind() 这类数据绑定方法只能在数据绑定控件的上下文中使用" 的错误

    原文:如何解决FormView中实现DropDownList连动选择时出现 "Eval().XPath() 和 Bind() 这类数据绑定方法只能在数据绑定控件的上下文中使用" 的 ...

  6. promise 的基本概念 和如何解决js中的异步编程问题 对 promis 的 then all ctch 的分析 和 await async 的理解

    * promise承诺 * 解决js中异步编程的问题 * * 异步-同步 * 阻塞-无阻塞 * * 同步和异步的区别? 异步;同步 指的是被请求者 解析:被请求者(该事情的处理者)在处理完事情的时候的 ...

  7. EBS中使用JAVA方式发送HTML格式邮件

    转自huan.gu专栏:http://blog.csdn.net/gh320/article/details/17174769 EBS中使用JAVA方式发送HTML格式邮件 一.开发工具:JDevel ...

  8. 15、解决14中csv用excel打开乱码的问题 open('zhihu.csv','w',newline='',encoding='utf-8-sig')

    解决14中csv用excel打开乱码的问题 ,其实就是在写csv的时候把 utf-8 改成 utf-8-sig open('zhihu.csv','w',newline='',encoding='ut ...

  9. Eclipse和MyEclipse使用技巧--解决MyEclipse中的js报错的小方法

    今天,下了个模版,但是导进去的时候发现js会报错.看了下其他都没有错误.而有一个js报错误,请原谅我有点红色强迫症,不能留一点红色 . 错误如下:Syntax error on token " ...

随机推荐

  1. 黄聪:WordPress 多站点建站教程(一):怎样开启WordPress多站点功能,实现手机移动端主题开发,与主站用户数据共享

    为了开发手机移动端的wordpress,需要使用Wordpress的多站点功能. 1.打开WordPress根目录下的wp-config.php文件, 在文件的任何位置加上以下内容: define(' ...

  2. PHP向客户端广播信息

    在网络中数据传播分为:Unicast(单播) , Multicast(多播或者组播) 和 Broadcast(广播).广播和多播仅应用于UDP,它们对需将报文同时传往多个接收者的应用来说十分重要.而 ...

  3. httpclient pool帮助类

    摘自爬虫类  用于频繁请求减少网络消耗 import java.io.IOException; import java.io.InterruptedIOException; import java.i ...

  4. MVVMLight介绍以及在项目中的使用

    http://www.des8.me/detail-1822826.html 一.MVVM 和 MVVMLight介绍 MVVM是Model-View-ViewModel的简写.类似于目前比较流行的M ...

  5. 安装MySQL时出现黄色感叹号,提示3306已被占用

    windows系统如何查看现在某个端口的应用进程id呢,命令是: 1.netstat  -aon|findstr 3306 2.最后的那个数值就是进程id号,此时需要查看该id号对应的应用是哪一个,可 ...

  6. ES6系列_1之开发环境搭建

    前言: 1.es6的简单介绍: ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,已经在2015年6月正式发布了.它的目标,是使得 JavaScript 语言 ...

  7. 字符串转码 将文本转为PDF

    @Test public void testBasic64Code() throws Exception { String strdata = new String("how are you ...

  8. TMapCoordinate

    MapPiter.Location := TMapCoordinate.Create(59.965, 30.35); MapPiter.Zoom := 10;

  9. Spring Boot日志集成

    Spring Boot日志框架 Spring Boot支持Java Util Logging,Log4j2,Lockback作为日志框架,如果你使用starters启动器,Spring Boot将使用 ...

  10. 跟我学算法-xgboost(集成算法)基本原理推导

    1.构造损失函数的目标函数 2.对目标函数进行泰勒展开 3.把样本遍历转换成叶子节点遍历,合并正则化惩罚项 4.求wj进行求导,使得当目标函数等于0时的wj的值 5.将求解得到的wj反导入方程中,解得 ...