解除OU屏蔽(EBS检查无法直接查询解决)
具有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. 在PO Schema 上创建一张表, 命名为 PO_HEADERS_ALL
2. 在APPS schema 上创建一个同义字(synonym) PO_HEADERS_ALL , 指向 PO.PO_HEADERS_ALL
3. 在APPS 中别一个同义字(synonym) 被创建: PO_HEADERS, 指向 PO_HEADERS_ALL
4. 通过使用 MO_GLOBAL.ORG_SECURITY, 行级别的安全被应用于 PO_HEADERS.
5. 这个可以通过运行 SQL
select * from all_policies where object_name='PO_HEADERS' 来再次确认
6. 这个策略的影响是无论何时当你访问 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)
通过模拟登录使apps.po_headers在PL/SQL中可以查询到数据
BEGIN
fnd_global.apps_initialize(user_id => 0 /* FND_GLOBAL.USER_ID*/, -- 请求提交用户ID
resp_id => 56736, -- 请求提交职责ID
resp_appl_id => 222); -- 职责应用
mo_global.init('M');
END;
SELECT * FROM mo_glob_org_access_tmp;
其中apps_initialize参数可以通过如下步骤获取值:
-
帮助->诊断->检查
-
“块”中填写值:profiles
-
在字段里分别填写:user_id、resp_id、resp_appl_id获取值
-
模拟登录完以后,就可以在PL/SQL中运行查询语句
SELECT t.org_id, t.* FROM apps.po_headers t -- 模拟登录以后,查询包含数据