使用VPD解决EBS中信息屏蔽问题
本文描述的是2005年在一个项目中采用Oracle VPD技术解决同一个OU下按照不同办事处屏蔽销售订单的解决方案。
VPD技术提供了数据库对象(表,同义词,视图)行级别访问的控制。关于VPD更多的信息不在此进行描述,有兴趣的同学可以查看Oracle Database Security Guide中的Using Virtual Private Database to Implement Application Security Policies章节。
一,业务需求
- 同一个OU下按照不同的办事处进行业务的操作
- 各办事处信息必须保证独立
- 办事处的人员只能对自己的客户下单
二,功能需求
由于上面的业务需求,以致需要有下面的功能需求
- 给不同的办事处设置不同的订单类型,并保证特定的订单类型只有特定的办事处所有,其它的订单类型为所有办事处拥有,对订单类型进行屏蔽
- 办事处只能使用自己的价目表来进行销售,需要对价目表进行办事处的屏蔽
- 办事处只能使用自己的客户及客户地址进行销售,需要对客户及客户地址进行屏蔽
- 办事处只能够查看和修改自己的订单信息,需要对销售订单进行屏蔽
三,技术方案
一般情况下,这样的需求在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谓词条件从而达到动态控制数据的安全。
下面是技术解决方案的主要步骤:
- 定义值集来维护办事处信息
- 定义一个预制文件来表明办事处身份
- 为每个办事处定义不同的职责,并将办事处的值分配给上面定义的预制文件
- 开启销售订单类型、价目表、客户和客户地址的描述性弹性域来记录办事处信息,将基础信息归类给各办事处,如果不设置办事处则表明所有办事处同时拥有,并写到个描述性弹性域段attribute1中(将这些基础数据按照办事处进行分类)
- 对销售订单类型、价目表、客户和客户地址的数据库表添加VPD安全策略,使attribute1字段受到办事处的限制(解决在销售订单界面或者其它地方引用这些对象是按照办事处屏蔽信息)
- 对销售订单头和行的表添加插入触发器,将办事处的信息写入 attribute1中,表明销售订单信息属于哪个办事处(解决录入数据的归属问题)?
- 对销售订单头和行的表添加VPD安全规则,使attribute1字段受到办事处的限制(解决订单查询时的屏蔽问题)
四,技术实现
很多技术的实现省略了,主要描述VPD策略如何实现:
首先是编写WHERE谓词条件:
1 |
FUNCTION oe_order_header_predicate( |
oe_order_header_predicate过程的两个参数类型是固定的,同时本文演示中将它放在cux_vpd_policy数据库包中
下面是注册VPD策略:
1 |
BEGIN |
上面只是演示了为销售订单头表添加VPD策略,其它的内容就留给读者自己来完成,如有任何问题或者更详细的内容,请提出来交流。
http://oracleseeker.com/2009/04/27/using_vpd_hide_information_in_oracle_ebs/
使用VPD解决EBS中信息屏蔽问题的更多相关文章
- 解决EBS中JAR包冲突的问题
同事解决的,摘抄上来备用. 问题描述:在OAF里调用ESB的服务报错如下: Error Page Exception Details. oracle.apps.fnd.framework.O ...
- geotrellis使用(十六)使用缓冲区分析的方式解决投影变换中边缘数据值计算的问题
Geotrellis系列文章链接地址http://www.cnblogs.com/shoufengwei/p/5619419.html 目录 前言 问题探索 采样说明 实现方案 总结 一.前言 ...
- 解决MyEclipse中的js报错的小方法
今天,下了个模版,但是导进去的时候发现js会报错.看了下其他都没有错误.而有一个js报错误,请原谅我有点红色强迫症,不能留一点红色 . 错误如下:Syntax error on token " ...
- 解决struts2中UI标签出现的问题: The Struts dispatcher cannot be found
解决struts2中UI标签出现的问题: The Struts dispatcher cannot be found 异常信息: The Struts dispatcher cannot be fou ...
- 如何解决FormView中实现DropDownList连动选择时出现 "Eval()、XPath() 和 Bind() 这类数据绑定方法只能在数据绑定控件的上下文中使用" 的错误
原文:如何解决FormView中实现DropDownList连动选择时出现 "Eval().XPath() 和 Bind() 这类数据绑定方法只能在数据绑定控件的上下文中使用" 的 ...
- promise 的基本概念 和如何解决js中的异步编程问题 对 promis 的 then all ctch 的分析 和 await async 的理解
* promise承诺 * 解决js中异步编程的问题 * * 异步-同步 * 阻塞-无阻塞 * * 同步和异步的区别? 异步;同步 指的是被请求者 解析:被请求者(该事情的处理者)在处理完事情的时候的 ...
- EBS中使用JAVA方式发送HTML格式邮件
转自huan.gu专栏:http://blog.csdn.net/gh320/article/details/17174769 EBS中使用JAVA方式发送HTML格式邮件 一.开发工具:JDevel ...
- 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 ...
- Eclipse和MyEclipse使用技巧--解决MyEclipse中的js报错的小方法
今天,下了个模版,但是导进去的时候发现js会报错.看了下其他都没有错误.而有一个js报错误,请原谅我有点红色强迫症,不能留一点红色 . 错误如下:Syntax error on token " ...
随机推荐
- 在Form Load中设置showInTaskBar =false 或 隐藏窗口 this.Hide()时会导致注册的全局快捷键无效
在Form Load中设置showInTaskBar =false 或 隐藏窗口 this.Hide() 会导致注册的全局快捷键无效. 反正是其中一个,有点记不清了. 在Form Shown中s ...
- php常量的实现
1.php的常量 就是一个简单的标识符,脚本执行期间不会改变,大小写敏感,默认大写. 常量的存储结构 typedef struct _zend_constant { zval value; //常量值 ...
- bzoj 3879: SvT
Description (我并不想告诉你题目名字是什么鬼) 有一个长度为n的仅包含小写字母的字符串S,下标范围为[1,n]. 现在有若干组询问,对于每一个询问,我们给出若干个后缀(以其在S中出现的起始 ...
- poj 1930 Dead Fraction(循环小数化分数)
Dead Fraction Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 3478 Accepted: 1162 Des ...
- pythonNetday06
进程 Process(target,name,args,kwargs) p.pid : 创建的新的进程的PID号 p.is_alive() 判断进程是否处于alive状态 p.daemon = Tru ...
- C++ 并发编程 01 线程api
1.使用多线程的好处: 提高性能,分离关注点 2. 多线程所在头文件 <thread> 3. 使用线程方式为std::thread(functioncall),如: #include & ...
- pandas read_csv读取大文件的Memory error问题
今天在读取一个超大csv文件的时候,遇到困难:首先使用office打不开然后在python中使用基本的pandas.read_csv打开文件时:MemoryError 最后查阅read_csv文档发现 ...
- 20165233 Java第四章学习总结
20165233 2017-2018-2 <Java程序设计>第三周学习总结 教材学习内容总结 基础 类:包括类声明和类体. 其中类声明的变量被称作对象变量,简称对象. 类体中包括两部分: ...
- Django学习---原生ajax
Ajax 原生ajax Ajax主要就是使用 [XmlHttpRequest]对象来完成请求的操作,该对象在主流浏览器中均存在(除早起的IE),Ajax首次出现IE5.5中存在(ActiveX控件). ...
- 如何解决JSP页面显示乱码问题
一.JSP页面显示乱码 下面的显示JSP页面(display.jsp)就出现乱码: <html> <head> <title>JSP的中文处理</title& ...