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);