R12的環境新增了一項 MOAC的功能,讓使用者可以在進入到一個Responsibiity後,能切換不同的OU,
操作人員就不用切換不同的Responsiblity 來使用資料,此功能搭配了Database的功能,讓此作業能夠實現.
接下來我們就來討論一下這二者之間的關係.
1. MOAC
- Oracle EBS的多組織架構(Multi-Org Architecture)在R12版之後有了新功能Multiple Organizations Access Control (MOAC)。
- A single application responsibility can now access, process and report on multiple operating units
- Perform tasks for Multiple operating units without changing responsibilities
2. 設定moac
- 設定Security profile
- 維護Security profile (Setup – Run System List Maintenance)
3.設定system Profile
- MO:Operating Unit 為11i所使用的profile,在r12中仍然有其功效. 若未設定Security profile 時,就捉取此profile的值.
- MO:Security Profile:若要啟動Security Profile請於profile中設定.
- MO:Default Operating Unit ,若有設定security profile 時,可為Security profile中的其中一個value值(預設),搭配security profile使用.
4. 測試成果: 若有使用moac,就可透過畫面上來切換不同的Operating unit.
5. VPD 說明
MOAC的實現是通過Oracle資料庫的VPD(Virtual Private Database)技術來實現的。 VPD技術提供了資料庫物件
(Table,Synonym,View)Row level 的控制。使用VPD技術可以有效地限制User獲取數據的範圍。
相關 View & package
- VPD View: dba_policies
- VPD Package: DBMS_RLS.add_polic
6.範例
- .平常查詢VPD表
select * from PO_HEADERS; --No Output
- 使用 Single OU Mode
BEGIN
mo_global.set_policy_context('S',204);
--204為ORG_ID,S表示Single Org Context
END;
select * from PO_HEADERS; --會輸出OU:204 的所有PO
- Multiple OU Mode(simulate login to a specific responsibility)
a. Call fnd_global.apps_initialize(userid,resp_id,resp_appl_id);
b. call MO_GLOBAL.INIT(p_appl_short_name);
This will read the MO profile option values for your responsibility/user, and will initialize the Multi Org Access.
c. select*from po_headers
7. MOAC的開發相關的Public API
- Package 名稱: MO_GLOBAL
檔案位置: patch/115/sql/AFMOGBLS.pls
說明: 供程式呼叫啟動MOAC初始值相關的APIs
- Package 名稱: MO_UTILS
檔案位置: patch/115/sql/AFMOUTLS.pls 說明: MOAC主要功能的API
8. VPD DB 範例
--VDP Sample
--1.Create table
create table demo (x number);
insert into demo values (1);
insert into demo values (2);
insert into demo values (10001);
insert into demo values (10002);
commit;
--2.Create function
CREATE OR REPLACE FUNCTION f_limited_query_t (s_schema IN VARCHAR2,
s_object IN VARCHAR2)
RETURN VARCHAR2
AS
BEGIN
RETURN 'X <= 10001';
END;
--3.add policy
BEGIN
DBMS_RLS.add_policy (object_schema => 'APPS',
object_name => 'DEMO',
policy_name => 'POLICY_LIMITED_QUERY_T',
function_schema => 'APPS',
policy_function => 'F_LIMITED_QUERY_T');
END;
--4. test
select * from DEMO
--5.Check policy is exist
SELECT * FROM DBA_POLICIES WHERE OBJECT_NAME='DEMO'
留言列表