当前位置:  数据库>oracle

Oracle EBS 多组织屏蔽的研究

    来源: 互联网  发布时间:2017-05-31

    本文导语: 1.1 具有OU屏蔽的表例子 SELECT t.org_id, t.*  FROM po.po_headers_all t  --无屏蔽表,在PL/SQL运行有数据 SELECT t.org_id, t.*  FROM apps.po_headers t    --包含OU屏蔽,在PL/SQL中查询无数据 1.2 多组织屏蔽原理 a. 在PO Schema 上创建一张表, 命名为 PO_HEA...

1.1 具有OU屏蔽的表例子

SELECT t.org_id, t.*  FROM po.po_headers_all t  --无屏蔽表,在PL/SQL运行有数据
SELECT t.org_id, t.*  FROM apps.po_headers t    --包含OU屏蔽,在PL/SQL中查询无数据

1.2 多组织屏蔽原理

a. 在PO Schema 上创建一张表, 命名为 PO_HEADERS_ALL
b. 在APPS schema 上创建一个同义字(synonym) PO_HEADERS_ALL , 指向 PO.PO_HEADERS_ALL
c. 在APPS 中别一个同义字(synonym) 被创建: PO_HEADERS, 指向 PO_HEADERS_ALL
d. 通过使用 MO_GLOBAL.ORG_SECURITY, 行级别的安全被应用于 PO_HEADERS.
这个可以通过运行 SQL select * from all_policies where object_name='PO_HEADERS' 来再次确认
e. 这个策略的影响是无论何时当你访问 PO_HEADERS 时, Oracle RLS 会动态的扩展WHERE 条件语句,如
SELECT * FROM PO_HEADERS WHERE EXISTS (SELECT 1 FROM mo_glob_org_access_tmp oa WHERE oa.organization_id = org_id)

1.3 通过模拟登录使apps.po_headers在PL/SQL中可以查询到数据

BEGIN
  fnd_global.apps_initialize(user_id => 1433, resp_id => 50691,
                            resp_appl_id => 222);
  mo_global.init('M');
END;

其中apps_initialize参数可以通过如下步骤获取值:
1.帮助->诊断->检查
2.“块”中填写值:$PROFILES$
3.在字段里分别填写:user_id、resp_id、resp_appl_id获取值
4.模拟登录完以后,就可以在PL/SQL中运行查询语句
SELECT t.org_id, t.*  FROM apps.po_headers t    --模拟登录以后,查询包含数据

1.4 mo_glob_org_access_tmp 表介绍

a. 通过第二点我们知道:当你访问 PO_HEADERS 时, Oracle RLS 会动态的扩展WHERE 条件语句,如:

SELECT *
  FROM po_headers
 WHERE EXISTS (SELECT 1
          FROM mo_glob_org_access_tmp oa
        WHERE oa.organization_id = org_id)

a. 在没有运行模拟登录前查询表mo_glob_org_access_tmp,为空值。这时WHERE语句为假,所以我们直接查询po_headers会发现找不到任何数据。

b. 运行模拟登录以后,再次查询表mo_glob_org_access_tmp,得到如下查询结果:

a. 这时重新查询po_headers,发现可以找到数据了。通过数据分析发现找到的数据和允许查询的数据时一致的:

a. 所以我们可以得出结论:当运行“模拟登录”的时候,系统会插入允许访问的ORG_ID到数据库表mo_glob_org_access_tmp里。当查询包含OU屏蔽的表时,系统自动判断当前session的mo_glob_org_access_tmp表允许查询出的ORG_ID,所以我们就可以访问这些org_id的数据了。

a. 当我们从表mo_glob_org_access_tmp删除一条数据,例如删除第一条数据:81 OU_AWL时,重新查询po_headers表,发现得到如下数据:

a. 当我们重新打开一个session,在没有模拟登录的情况下,我们直接插入ORG_ID到表mo_glob_org_access_tmp中时,重新查询表po_headers,发现也是可以得到数据的。所以我们可以得出以下结论

当你访问 PO_HEADERS 时, Oracle RLS 会动态的扩展WHERE 条件语句

SELECT *
  FROM po_headers
 WHERE EXISTS (SELECT 1
          FROM mo_glob_org_access_tmp oa
        WHERE oa.organization_id = org_id)
a. 
当在你session中的Multi Org初始化之后, 表 mo_glob_org_access_tmp 中, 你的 session 会有 X 条记录 . X 表示的是被赋予 MO Security Profile 的组织机构的数量。

1.5 mo_global.init 的目的

它会通过检查是否新的Multi Org Security Profile被设置来决定是否有新的  Security Profile 方法被使用.

如果设置了新的MO security profile, 那么 mo_global.init 会为在 Org Hierarchy 中的每个组织机构插入一条新的记录到表  mo_glob_org_access_tmp 中。

这个方法会在你登录后或者是切换职责后立即被调用. 就像FND_GLOBAL.INITIALIZE 被调用一样, 可以安全的确定 Oracle 会在 FND_GLOBAL.INITIALIZE 之后调用 MO_GLOBAL.INIT

1.6 MO_GLOBAL.SET_POLICY_CONTEXT('S',101)作用

ORG_ID 101 会被赋予你当前的session.

在其内部, 当你对你的单个org设置上下文(Context)时,这段的代码将会被执行: dbms_session.set_context('multi_org2', 'current_org_id', 101);


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 安全研究专家发现访问Oracle数据库的新攻击方法
  • Oracle数据完整性嵌套事务调用分析研究
  • Oracle中虚拟专用数据控制方法研究
  • Oracle数据库的备份及恢复策略研究
  • Oracle 12c发布简单介绍及官方下载地址
  • 在linux下安装oracle,如何设置让oracle自动启动!也就是让oracle那个服务自动启动,不是手动的
  • oracle 11g最新版官方下载地址
  • 请问su oracle 和su - oracle有什么不同?
  • Oracle 数据库(oracle Database)Select 多表关联查询方式
  • 虚拟机装Oracle R12与Oracle10g
  • Oracle数据库(Oracle Database)体系结构及基本组成介绍
  • Oracle 数据库开发工具 Oracle SQL Developer
  • 如何设置让Oracle SQL Developer显示的时间包含时分秒
  • Oracle EBS R12 支持 Oracle Database 11g
  • Oracle 10g和Oracle 11g网格技术介绍
  • SCO unix下安装oracle,但没有光盘,请大家推荐一个oracle下载站点(unix版本的)。谢谢!!!!
  • oracle中如何把表中具有相同值列的多行数据合并成一行
  • 请问大家用oracle数据库, 用import oracle.*;下的东西么? 还是用标准库?
  • Oracle 数据库(oracle Database)性能调优技术详解
  • Linux /$ORACLE_HOME $ORACLE_HOME
  • ORACLE日期相关操作
  • Linux系统下Oracle的启动与Oracle监听的启动
  • ORACLE数据库常用字段数据类型介绍
  • 请问在solaris下安装ORACLE,用root用户和用oracle用户安装有什么区别么?
  • Oracle 12c的九大最新技术特性介绍
  • 网间Oracle的连接,远程连接Oracle服务器??


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,