Oracle EBS R12多组织访问架构

关于R12的新特性Multi-Org Access Control(MOAC).Oracle宣传的好处主要有:
1.enable users to access to secured data in one or more Operating Units from a single responsibility
2.End-Users can access/transact data within several operating units based on Security Profile attached to a responsibility.
3.Profile 'MO:Security Profile' will ensure access to multiple operating units from single responsibility


具 体为什么会改成这样的原因可以从R12的宣传语看出:"The Global Business Release" "R12 Enables You To Think Globally,Work Globally,Manage Systems Globally "
从技术角度的一些拾零记录
1.在R12之前的版本中,组织控制是通过View来实现,比如说AP_INVOICES是定义在AP_INVOICES_ALL上面的View,而View一般都是通过在ORG_ID加条件来限制数据访问.
从R12开始,这样的View被取消了,取而代之的是同义词(synonyms),比如说AP_INVOICES就是AP_INVOICES_ALL的同义词(synonyms).
在R12里可以通过下面的SQL语句来查询有这样关系的表
---
select *
from dba_synonyms syn
where syn.synonym_name || '_ALL' = syn.table_name
---
2.R12中的组织访问限制是如何实现的呢?
是通过数据库安全方面的新特性virtual private database (VPD) policy来实现的,具体就是给_ALL表的同义词(比如说AP_INVOICES),添加对应的Policy.
这样在在查询的时候,数据库会根据Policy的来生成对应的条件(where)语句,来限制我们对数据的访问.
通过select * from dba_policies where policy_name = 'ORG_SEC'我们可以查询到那些表添加了Policy,以及是通过那个具体的Function来生成要添加的where条件
我们通过查询可以发现,比较具体的一个例子
Policy_name: ORG_SEC
Policy_group: SYS_DEFAULT
Package: MO_GLOBAL
Function: ORG_SECURITY
通过查看MO_GLOBAL.MO_GLOBAL,我们可以看到具体的生成限制语句的逻辑.其中Multiple OU Access是通过GLOBAL TEMPORARY TABLE MO_GLOB_ORG_ACCESS_TMP来实现的.
可以参看Note462383.1来看具体的每种情况会生成什么样的Where条件(a WHERE clause).
3.可以通过表FND_MO_PRODUCT_INIT中的STATUS来判断具体的某个Application是否支持MOAC.
4.通过表FND_MO_SP_PREFERENCES的User_ID, Resp_ID, Security_Profile_ID可以查看缺省的组织(Default Org_ID).相关联的Profile是MO: Default OU
5.MOAC定义的步骤
1.Define Operating Units(Optional)
2.Define Security Profile Enter the Operating Units for which you want access
3.Run concurrent program "Security List Maintenance Program"
4.Assign the security profile to MO: Security Profile profile option for your responsibility or user
5.Assign MO: Default Operating Unit(Optional)
6.Assign MO: Operating Unit(Mandatory for only Single Org or if MO: Security Profile is not defined)
6.MOAC在应用中初始化的基本流程
1.MO_GLOBAL.init
2.Set_Org_Access -- MO_GLOB_ORG_ACCESS_TMP
3.Check FND_MO_PRODUCT_INIT
4.If MO: Security Profile Else MO: Operating Unit
5.Set Policy Context "A", "S", "M" and org_id
注:这里的Policy Context的含义如下
Restrict the data to eliminate only seed data rows is the access mode is All
Restrict the data to a single operating unit if the access mode is Single
Restrict the data to multiple operating units if the access mode is Multiple
Restrict the data to not return any rows if the access mode is None
Reference:
Doc ID:462383.1 SQL Queries and Multi-Org Architecture in Release 12

 

 

转自:http://blog.csdn.net/cunxiyuan108/article/details/6203156

 

(一)  多OU总结

 

1.  Form多OU实现

 

1)  创建一个Table,以CUX_AP_CHECK_HEADER_ALL为例

 

2)  创建Table的两个Synonym(一个不含_ALL,一个以_ALL结尾):CUX_AP_CHECK_HEADER和CUX_AP_CHECK_HEADER_ALL

 

3)  给不含_ALL的Synonym:CUX_AP_CHECK_HEADER加上组织屏蔽的策略函数

 

dbms_rls.add_policy(object_name       => 'CUX_AP_CHECK_HEADER',

 

          policy_name       => 'ORG_SEC',

 

          policy_function => 'MO_GLOBAL.ORG_SECURITY',

 

              policy_type       =>  dbms_rls.shared_context_sensitive);

 

4)  在不含_ALL的Synonym的基础上创建视图: CUX_AP_CHECK_HEADER_V

 

5)  进入FORM时(pre-form触发器)添加代码:

 

mo_global.init(&p_appl_shortname);--p_appl_shortname为应用简称

 

6)  当选择某个OU时(一般在when_validate_item触发器)中添加代码:mo_global.set_policy_context('S',&p_org_id);--p_org_id为OU的id

 

2.  Report多OU实现

 

1)  给并发程序设置业务实体模式:单个,多个和空(默认)。一般设置为‘单个’

 

业务实体模式对应表fnd_concurrent_programs中的multi_org_category字段

 

2)  得到当前OU的值。

 

使用:mo_global.get_current_org_id或者fnd_global.org_id

 

3)  在报表的参数和报表的逻辑中加上OU的限制

 

3.  GL数据的多OU实现

 

1)  得到当前OU的值。

 

使用:mo_global.get_current_org_id或者fnd_global.org_id

 

2)  根据OU的值得到部门段的值:

 

DECLARE

 

    l_segment1  VARCHAR2(150);--部门段

 

   BEGIN  

 

SELECT o3.attribute5

 

   INTO l_segment1

 

  FROM hr_all_organization_units     o,

 

       hr_all_organization_units_tl  otl,

 

       hr_organization_information   o2,

 

       hr_organization_information   o3

 

WHERE o.organization_id = o2.organization_id

 

   AND o.organization_id = o3.organization_id

 

   AND o2.org_information_context = 'CLASS'

 

   AND o3.org_information_context = 'Operating Unit Information'

 

   AND o2.org_information1 = 'OPERATING_UNIT'

 

   AND o2.org_information2 = 'Y'

 

   and o.organization_id = otl.organization_id

 

   and o.organization_id = &p_org_id –OU id

 

   AND otl.LANGUAGE = USERENV('LANG');

 

END;

 

3)  将步骤2得到的值作为限制条件:

SELECT gl_code_combinations gcc WHERE gcc.segment1 = l_segment1;

4.  Interface多OU总结

1)  给并发程序设置业务实体模式:单个,多个和空(默认)。业务实体模式对应表fnd_concurrent_programs中的multi_org_category字段

2)  如果接口的导入程序中OU作为一个参数,则应该将所有的OU作一次循环。

5.  多OU实现扩展知识

1)  给客户化应用注册和取消MOAC的控制

fnd_mo_product_init_pkg.register_application(注册应用)

fnd_mo_product_init_pkg.register_application(取消应用)

查看支持MOAC的应用SQL:

SELECT * FROM fnd_mo_product_init;

2)  给数据库对象注册和取消策略-policy

dbms_rls.add_policy(注册策略)

dbms_rls.drop_policy(取消策略)

3)  多OU 涉及到的表

a)   查看数据库对象是否增加了策略-policy

SELECT * FROM dba_policies;

b)   查看当前session所能访问的OU

SELECT * FROM mo_glob_org_access_tmp;

c)   查看当前session应用上下文(context)的值(说明:OU的值保存在context中)

SELECT * FROM dba_context dc WHERE dc.namespace LIKE 'MULTI%';

MOAC使用的应用程序上下文:MULTI_ORG,MULTI_ORG2

(二)  多帐套总结

1.   客户化开发中的多帐套屏蔽

1)  得到当前OU的值。

使用:mo_global.get_current_org_id或者fnd_global.org_id

2)  根据组织id得到帐套id和公司名称。SQL语句为:

DECLARE 

   l_org_information3 VARCHAR2(150);--帐套id

        l_company_desc     VARCHAR2(150);--公司中文描述

  BEGIN

   SELECT o3.org_information3,o3.attribute3

     INTO l_org_information3,l_company_desc

     FROM hr_all_organization_units    o,

          hr_all_organization_units_tl otl,

          hr_organization_information  o2,

          hr_organization_information  o3

    WHERE o.organization_id   = o2.organization_id

      AND o.organization_id   = o3.organization_id

      AND o2.org_information_context || '' = 'CLASS'

      AND o3.org_information_context = 'Operating Unit Information'

      AND o2.org_information1 = 'OPERATING_UNIT'

      AND o2.org_information2 = 'Y'

      AND o.organization_id   = otl.organization_id

      AND otl.language        = USERENV('LANG')

      AND o.organization_id   = &p_org_id;--OU id

   END;

3)  得到本位币,SQL语句为:

DECLARE

l_local_currency_code VARCHAR2(15);--本位币

BEGIN

SELECT gsob.currency_code

    INTO l_local_currency_code

   FROM gl_sets_of_books gsob, hr_operating_units hou

  WHERE gsob.set_of_books_id = hou.set_of_books_id

  AND   hou.organization_id  = &p_org_id;--OU ID

END; 

4)  在程序中加上帐套和本位币的限制

2.   多帐套实现扩展

1)  得到帐套的SQL语句为:

SELECT * FROM gl_ledgers;

2)  得到法人的SQL语句为:

SELECT * FROM xle_entity_profiles;

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25164132/viewspace-759075/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/25164132/viewspace-759075/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值