本文描述的是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. Vue 基本用法

    Vue的基本用法 模板语法{{ }} 关闭掉 django中提供的模板语法{{ }} 指令系统 v-text v-html v-show和v-if v-bind和v-on v-for v-model ...

  2. MySQL锁之二:锁相关的配置参数

    锁相关的配置参数: mysql> SHOW VARIABLES LIKE '%timeout%'; +-----------------------------+----------+ | Va ...

  3. HDU King (非连通图的差分约束,经典好题)

    King Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  4. linux Valgrind使用说明-内存泄漏

    Valgrind使用说明 Valgrind manual: http://valgrind.org/docs/manual/manual.html valgrind的介绍.安装和使用 valgrind ...

  5. mysql-11元数据

    我的mysql是用docker配置的,服务器状态和服务器配置变量都未设置,报错正常.

  6. php soap实例讲解

    一,什么是soap,什么是wsdl,为什么要用他们 SOAP是基于XML和HTTP通信协议,xml各种平台,各种语言都支持的一个种语言.http呢它得到了所有的因特网浏览器及服务器的支持. WSDL ...

  7. OpenMP 循环调度 + 计时

    ▶ 使用子句 schedule() 来调度循环,对于循环中每次迭代时间不相等的情况较为有效 ● 代码 #include <stdio.h> #include <stdlib.h> ...

  8. easyui制作进度条案例demo

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  9. Httpservlet源码说明

    上一篇看了Servlet接口,现在来看下我们经常涉及的Httpservlet: /** * * Provides an abstract class to be subclassed to creat ...

  10. JAVA 操作Excel工具类

    Bean转Excel对象 /* * 文件名:BeanToExcel.java */ import java.util.ArrayList; import java.util.List; import ...