284354749 发表于 2018-9-13 07:26:50

oracle ebs 多组织屏蔽的研究

  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]
查看完整版本: oracle ebs 多组织屏蔽的研究