Oracle EBS 多組織屏蔽的研究

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.