本篇文章為大家展示了怎么深入研究EBS MOAC,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
我希望你已經讀了文章 EBS R12 中的 Multi Org . 當我們在思考R12中的 Multi Org 時,總有一些問題會出現在腦海中, 對這些問題最好的分析就是打開包 MO_GLOBAL,別擔心你還沒有裝R12, MO_GLOBAL在11.5.10 就已經有了, 現在讓我們開始吧.
在R12中,CLIENT_INFO是如何被替換的呢?
我們先來舉個例子.
在R12之前的版本, 你通過以下方法來創建表 PO_HEADERS_ALL
a. 在PO Schema 上創建一張表, 命名為 PO_HEADERS_ALL
b. 在APPS schema 上創建一個同義字(synonym) PO_HEADERS_ALL , 指向 PO.PO_HEADERS_ALL
c. 在APPS schema 上創建視圖PO_HEADERS: "select * from po_headers_all where org_id=client_info"
但是在R12中,下面的事情將會發生:
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)
也請參考下面的 **** .
是否這就意味著,如果我創建一張新的客制化的表,我就要把RLS [ Row Level Security ] 應用在這張表上?
是的沒錯, 如果這張表包含著以ORG_ID來區分的數據, 那就應該這樣. 在這個例子中你所要做的就是將包里的功能MO_GLOBAL.ORG_SECURITY 賦予那些 表/同義字/視圖.
Multi Org 的RLS[Row Level security]是否也會被應用在 表/同義字/視圖 上呢?
理論上是這樣的, RLS 能被應用在以上的任意一個對象中, 但是在實踐中,你只會將 RLS 應用在 APPS Schema 中的對象, 這意味著, 你最有可能的就是把RLS應用在同義字上. 基本上, 現在Multi Org 視圖已經被受 RLS 保護的同義字替換, 但是, 當訪問R12之前版本的Multi-Org安全視圖時, 我們不需要修改現有的代碼. 現在, 根據ORG_ID來實現數據安全訪問的職責依賴于RLS[也被叫作 VPD - Virtual Private Database].
我已經對我的 Multi Org Security Profile 做了些改變, 方式是通過附加一個新的Org層次, 我還需要運行其它的程序嗎?
就像我們在HRMS中所做的一樣, 所建議的是在Security Profiles上做任何改變后, 都運行程序 "Security List Maintenance"
什么是MO_GLOBAL.INIT
mo_global.init 的目的 :-
它會通過檢查是否新的Multi Org Security Profile被設置來決定是否有新的 Security Profile 方法被使用.
如果設置了新的MO security profile, 那么 mo_global.init 會為在 Org Hierarchy 中的每個組織機構插入一條新的記錄到表 mo_glob_org_access_tmp 中
mo_global.init 是在何時何地被調用的 ?
這個方法會在你登錄后或者是切換職責后立即被調用. 就像FND_GLOBAL.INITIALIZE 被調用一樣, 可以安全的確定 Oracle 會在 FND_GLOBAL.INITIALIZE 之后調用 MO_GLOBAL.INIT
mo_glob_org_access_tmp 是一張全局臨時表(global temporary table)嗎?
是的, 當在你session中的Multi Org初始化之后, 表 mo_glob_org_access_tmp 中, 你的 session 會有 X 條記錄 . X 表示的是被賦予 MO Security Profile 的組織機構的數量 [在 security profile 中查看組織層次或者組織列表]
MO_GLOBAL.ORG_SECURITY 的目的是什么 ?
Row-Level-Security 的目的是隱藏某些數據[基于一些條件]. RLS 是通過擴展安全對象上的where條件語句來實現的.
1. MO_GLOBAL.ORG_SECURITY 的功能是返回WHERE條件語句
2. 這個where 條件語句會被擴展到那些已經啟用Multi Org行級別安全的 表/同義字/視圖 中
MO_GLOBAL.SET_POLICY_CONTEXT 的目的是什么?
這個 procedure 有兩個參數
p_access_mode
當你想讓你當前的session只會對一個ORG_ID工作時, 輸入"S"
當你想讓你當前的session只會對多個ORG_ID工作時, 輸入"M"
p_org_id
只有當p_access_mode的值是"S"時才需要
在SQL*Plus中,我想對一個指定的Org[單個Org]設置session, 在R12中我該如何做呢?
SQL>> exec MO_GLOBAL.SET_POLICY_CONTEXT('S',101);
在上面的例子中, ORG_ID 101 會被賦予你當前的session.
在其內部, 當你對你的單個org設置上下文(Context)時,這段 藍色 的代碼將會被執行: dbms_session.set_context('multi_org2', 'current_org_id', 101);
**** 如果當前的數據庫session被初始化為單個Org[如上面的步驟], 那么在行級別安全(Row-Level-Security)上擴展到對象的 Where 語句就會是
WHERE org_id = sys_context('multi_org2','current_org_id')
為什么我作為一個應用程序技術人員會使用 MO_GLOBAL.SET_POLICY_CONTEXT 呢?
我們假設你想在ORG_ID為101下通過調用API來創建invoice, 但是這個API又沒有Org_id的參數,那么你可以這樣做:
a. e執行 MO_GLOBAL.SET_POLICY_CONTEXT('S',101)
b. 調用 Invoice API, 這將會在其內部從當前的MO上下文(Context)中讀取ORG_ID.
在SQL*Plus中,我想模擬一次登錄到指定的職責上,我該如何做?
a. 調用 FND_GLOBAL.INITIALIZE
這將會設置你的職責ID,用戶ID等等(responsibility id, user_id)
b. 調用 MO_GLOBAL.INIT
這將會你的的職責/用戶中讀取 MO配置選項的值,并且初始化多組織訪問(Multi Org Access).
上述內容就是怎么深入研究EBS MOAC,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。