oracle ebs 多组织屏蔽的研究
1.1 具有OU屏蔽的表例子
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中可以查詢到數據
BEGINfnd_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_headersWHERE EXISTS (SELECT 1FROM mo_glob_org_access_tmp oaWHERE 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_headersWHERE EXISTS (SELECT 1FROM mo_glob_org_access_tmp oaWHERE 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);
轉載于:https://blog.51cto.com/snans/1352377
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的oracle ebs 多组织屏蔽的研究的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PLSQL_统计信息系列10_统计信息过
- 下一篇: HTML5 跨文档消息传输