设为首页 收藏本站
查看: 1405|回复: 0

[经验分享] oracle ebs 多组织屏蔽的研究

[复制链接]

尚未签到

发表于 2018-9-13 07:26:50 | 显示全部楼层 |阅读模式
  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);



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-577320-1-1.html 上篇帖子: oracle数据库下的分页查询 下篇帖子: oracle 批量更新
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表