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