壹佰网|ERP100 - 企业信息化知识门户

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2978|回复: 18

[财务] R12 总账数据访问安全性控制

  [复制链接]
发表于 2011/9/28 06:43:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。如果您注册时有任何问题请联系客服QQ: 83569622  。

您需要 登录 才可以下载或查看,没有帐号?注册

x
EBS版本:12.0.0以上

在Oracle EBS 12 之前,很多项目中希望按照某些规则进行总账数据的屏蔽只能通过客户化开发来实现,如按照OU进行凭证的屏蔽,同时FSG报表的数据也需要按照同样的规则屏蔽相关数据.这样的要求需要开发人员修改较多的数据库视图定义和PL/SQL程序,同时导致EBS的升级是一个较麻烦的事情。 在Oracle EBS 12之中,Oracle对数据安全性的控制作了独立的设计。 后续文章中,我将结合功能和技术对总账的数据安全性控制做一个介绍,由于内容设计系统功能和技术层面,因此会分做多篇文章来描述。   数据访问权限集(Data Access Set)介绍

Oracle EBS12 中,通过数据访问权限集来控制职责能够访问哪些分类账,它可以限制用户只能够存取某些平衡段值或管理段值,或者授权给一个职责只能读取或者同时具备读写分类账中数据的权限。
如果分类账和分类账集分配给同一个数据存取集,必须保证它们是共享同样的账户结构、会计日历和期间类型
系统中可以定义如下三种类型的数据访问权限集:
  • 全部分类账
  • 平衡段值(BSV)
  • 管理段值(MSV)

全部分类账(Full Ledger):
用户可以存取整个分类账的数据。如:在数据访问权限集中包含2个分类账,A和B,可以设置用户只能够读取A分类账中的数据,没有写数据的权限;而设置用户能够同时读写B分类账中的数据

平衡段值(Balancing Segment Values/BSV):
授权用户存取所有或者某些特定分类账平衡段值的账户组合。譬如,可以定义一个数据访问权限集来控制分类账A的数据读取:对平衡段值01只有读取权限;对平衡段值02具有读写权限;而对于平衡段值03则没有读写的权限 管理段值(Management Segment Values/MSV):
授权用户存取所有或者某些特定分类账管理段值的账户组合。譬如,可以定义一个数据访问权限集来控制分类账A的数据读取:对管理段值100只有读取权限;对平衡段值200具有读写权限;而对于平衡段值300则没有读写的权限。要启用管理段的控制必须账户结构定义中指定了管理段。   满足下列条件时,Oracle General Ledger自动生成数据访问权限集:
  • 创建一个分类账
  • 定义一个分类账集

系统为分类账生成的数据访问权限集和分类账同名,这个权限集使用了“全部分类账”的访问权限集类型,提供了完全读写整个分类账数据的权限。
系统为分类账集生成的数据访问权限集和分类账集同名,这个权限集使用了“全部分类账”的访问权限集类型,提供了完全读写所有分配给分类账集中分类账的数据权限。

如果只需要控制和系统生成数据访问权限集一致的权限控制,直接使用系统生成的数据访问权限集,无须而外手工创建数据访问权限集。
只有当需要更小粒度的控制分类账、分类账集、特定平衡段值或特定管理段值的数据读取权限的时候,才需要手工创建数据访问权限集。


该贴已经同步到 纵横四海的微博
 楼主| 发表于 2011/9/28 06:44:07 | 显示全部楼层
一、定义数据访问权限集
路径:总账超级用户–>设置–>财务系统–>数据访问权限集 定义数据访问权限集有以下主要3个步骤:

  • 输入数据访问权限集的信息:名称、说明、科目表、日历、访问权限集类型和默认分类账
  • 给数据访问权限集分配分类账/分类账集
  • 设置权限:只读、读和写

定义示例
1)全部分类账类型

  • 访问权限集类型:全部分类账
  • 访问详细资料中选择分类账/分类账集的名称
  • 设置权限:Read and Write

gl-access-set-full-ledger-define-thumb.png

2)平衡段值类型

  • 访问权限集类型:平衡段值
  • 访问详细资料中选择分类账/分类账集的名称和特定的平衡段值:指定只能读写平衡段值为01的
  • 设置权限:Read and Write

gl-access-set-bsv-define-thumb.png 二、分配数据访问权限集给职责

给相应的职责分配预制文件:GL:数据访问权限集/GL_ACCESS_SET_ID的值为已定义的数据访问权限集的名称,如下图中给职责“General Ledger, AroneZhang”分配权限集“Data Access Set, AroneZhang”:
gl-access-set-assign-resp-thumb.png


三、登录系统验证安全性控制

注:下图是通过一个具备完整权限的用户查询出的凭证信息:“06-NOV-02 Project Mfg To Consolidation USD”

gl-access-set-journal-entry-thumb.png


切换到职责:General Ledger, AroneZhang,再次查询凭证信息,由于凭证行账户组合的平衡段都是03,因此无法查找出凭证信息:

gl-access-set-journal-find-no-result-thumb.png

其它较细节的功能就留给读者自己去试验了。
 楼主| 发表于 2011/9/28 06:45:06 | 显示全部楼层
纵横四海 发表于 2011/9/28 06:44
一、定义数据访问权限集
路径:总账超级用户–>设置–>财务系统–>数据访问权限集 定义数据访问权限集有以 ...

下面介绍数据访问安全性控制两个不足的地方

一、凭证查找

在凭证查找的窗口中,凭证批号和凭证号的列表没有按照数据安全的设置进行屏蔽,因此会出现列表能够选择出来的凭证批和凭证是无法查找出来的,这样给用户的使用带来了一定的不方便。如下:

gl-access-set-journal-entry-thumb1.png
注:此凭证通过具有权限的职责查询出来 如上图的凭证:06-NOV-02 Project Mfg To Consolidation USD
此凭证所有的凭证行的账户组合的平衡段值都是03的,而我的职责分配了数据权限集只能访问平衡段值为:01的。但是这个凭证名称在查找窗口的凭证列表中还是出现的,只是我选择了它之后查找没有结果,如下图: gl-access-set-journal-entry-find-thumb.png

gl-access-set-journal-find-no-result-thumb1.png

二、账户组合录入

在总账模块输入账户组合时,如果设置了数据安全性屏蔽是按照平衡段或者管理段来进行屏蔽的时候,在录入账户组合的时候,用户可以看到不该看到的段值,只是在确认段组合的时候提示没有权限操作账户组合,无法完成录入,这样也给操作人员带来一定的麻烦。
数据访问权限集中设置了只能访问平衡段值为:01的。但是选择平衡段的时候还是能够看到所有的段值。只有确认账户组合的时候才会弹出:您无权访问此账户。如下图:
gl-access-set-gcc-segment-val-thumb.png

gl-access-set-gcc-no-access-thumb.png

==
 楼主| 发表于 2011/9/28 06:45:37 | 显示全部楼层
纵横四海 发表于 2011/9/28 06:45
下面介绍数据访问安全性控制两个不足的地方

一、凭证查找

下面介绍启用了数据访问安全性控制之后可能会遇到的问题

一、凭证导入失败
如果职责设置了受限制的数据访问权限集,很有可能在进行凭证导入的过程中发生错误,由于导入过程中导入程序会检测用户是否有读取数据的权限,如果发现GL_INTERFACE表中包括了一些用户无法在总账模块操作的数据,导入程序会报出如下的错误代码和信息:
EM29 You do not have access to this ledger and account combination.
二、无法打开会计期

无法打开会计期,打开会计期的按钮是灰色的,如下图:
gl-access-set-cannot-open-period-thumb.png

这是由于用户的职责不具备完全访问分类账数据的权限,只要切换到具备完整数据访问权限的职责即可打开会计期了。
 楼主| 发表于 2011/9/28 06:46:33 | 显示全部楼层
纵横四海 发表于 2011/9/28 06:45
下面介绍启用了数据访问安全性控制之后可能会遇到的问题

一、凭证导入失败

本文介绍在客户化开发的程序中需要考虑总账数据访问安全性的控制

一、Form界面开发
如果Form界面中需要引用账户组合,同时希望账户组合受到数据安全性控制,需要增加如下的工作:
  • 添加GLCORE.pll库文件到Form中
  • 在账户组合字段的WHEN-VALIDATE-ITEM触发器中添加如下的代码来验证权限
gl_flexfield. validate(ledger_id NUMBER, flexmode VARCHAR2, flexvalue VARCHAR2, alevel VARCHAR2, full_validation BOOLEAN, edate DATE)

这个过程验证如果失败后,过程中会抛出这个消息:GLCORE_NO_ACCESS
ledger_id:分类账ID
flexmode:账户组合模式,指弹性域包括:所有段组合,账户段,平衡段和管理段
                  对应可以提供的值:gl_flexfield.ALL_SEGMENTS, gl_flexfield.ACCOUNT, gl_flexfield.BALANCING, gl_flexfield.MANAGEMENT
flexvalue
:账户的段值,根据账户组合模式不同提供不同的值
alevel:数据访问权限级别:完全、写、只读和无权限。
             对应的值:gl_access_set.FULL_ACCESS, gl_access_set.WRITE_ACCESS, gl_access_set.READ_ONLY_ACCESS, gl_access_set.NO_ACCESS
full_validation
:段值是否需要验证
edate:验证段值的日期,此值为null时跳过值的验证
下面是一个实际的代码例子:
gl_flexfield.validate(:HEADER.ledger_id,
         gl_flexfield.ALL_SEGMENTS, INES.accounting_flexfield,
         gl_access_set.WRITE_ACCESS, TRUE, :HEADER.default_effective_date);

二、SQL编写

如果希望编写的SQL执行结果受到数据安全性的控制,需要特别添加限制。

1)凭证相关
如果在程序中希望SQL取出的凭证数据受到数据安全性的控制,那需要连接数据库表
GL_JE_SEGMENT_VALUES来过滤数据,主要的字段:
je_header_id:凭证头ID
segment_type_code:段值类型,有B代表平衡段;M代表管理段
segment_value:段值

表关系图:  

同时检查数据安全性设置表GL_ACCESS_SET_ASSIGNMENTS中的设置:
access_set_id = fnd_profile.value(‘GL_ACCESS_SET_ID’)
ledger_id
segment_value
access_privilege_code

下面是一个使用的例子:
SELECT *
  FROM gl_je_batches_headers_v
WHERE chart_of_accounts_id = 101
   AND period_set_name = ‘Accounting’
   AND accounted_period_type = ‘Month’
   AND (gl_je_batches_headers_v.ledger_id IN
       (SELECT acc.ledger_id
           FROM gl_access_set_ledgers acc
          WHERE acc.access_set_id = fnd_profile.value(‘GL_ACCESS_SET_ID’)) AND EXISTS
        (SELECT ‘readable line’
           FROM gl_je_segment_values sv, gl_access_set_assignments acc
          WHERE sv.je_header_id = gl_je_batches_headers_v.je_header_id
            AND sv.segment_type_code = ‘B’
            AND acc.access_set_id = fnd_profile.value(‘GL_ACCESS_SET_ID’)
            AND acc.ledger_id = gl_je_batches_headers_v.ledger_id
            AND acc.segment_value = sv.segment_value))
   AND (je_batch_id = header_je_batch_id_qry + 0)
   AND (header_name = ’06-NOV-02 Project Mfg To Consolidation USD’)
ORDER BY batch_name, period_name

2)分类帐相关
如果在程序中希望SQL取出的分类账数据受到数据安全性的控制,那需要连接数据库表
XLA_AE_SEGMENT_VALUES
ae_header_id:分类账头ID
segment_type_code:段值类型,有B代表平衡段;M代表管理段
segment_value:段值

表关系图:     同时检查数据安全性设置表GL_ACCESS_SET_ASSIGNMENTS中的设置:
access_set_id = fnd_profile.value(‘GL_ACCESS_SET_ID’)
ledger_id
segment_value
access_privilege_code   一个使用的例子:
SELECT *
  FROM xla_ae_headers xah
WHERE (ledger_id IN
       (SELECT acc.ledger_id
           FROM gl_access_set_ledgers acc
          WHERE acc.access_set_id = fnd_profile.VALUE(‘GL_ACCESS_SET_ID’)) AND
       EXISTS
        (SELECT ‘readable line’
           FROM xla_ae_segment_values sv, gl_access_set_assignments acc
          WHERE sv.ae_header_id = xah.ae_header_id
            AND sv.segment_type_code = ‘B’
            AND acc.access_set_id = fnd_profile.VALUE(‘GL_ACCESS_SET_ID’)
            AND acc.ledger_id = xah.ledger_id
            AND acc.segment_value = sv.segment_value))
  三、PL/SQL编写

如果在客户化编写的PL/SQL程序中需要考虑总账数据安全性控制,使用数据库包GL_FORMSINFO中所提供的过程与方法,下面是它的声明: SQL> descr GL_FORMSINFO;
Element                   Type      
————————- ———
FULL_ACCESS               CONSTANT  
WRITE_ACCESS              CONSTANT  
READ_ACCESS               CONSTANT  
NO_ACCESS                 CONSTANT  
GET_COA_INFO              PROCEDURE
GET_ACCESS_INFO           PROCEDURE
CHECK_ACCESS              FUNCTION  
GET_LEDGER_TYPE           FUNCTION  
GET_DEFAULT_LEDGER        FUNCTION  
HAS_SINGLE_LEDGER         FUNCTION  
WRITE_ANY_LEDGER          FUNCTION  
GET_LEDGER_INFO           PROCEDURE
VALID_BSV                 FUNCTION  
VALID_MSV                 FUNCTION  
MULTI_ORG                 FUNCTION  
INSTALL_INFO              FUNCTION  
GET_IEA_INFO              PROCEDURE
GET_USAGE_INFO            PROCEDURE
GET_BUSINESS_DAYS_PATTERN PROCEDURE
IEA_DISABLED_SUBSIDIARY   FUNCTION  
GET_INDUSTRY_MESSAGE      FUNCTION  
SESSION_ID                FUNCTION  
SERIAL_ID                 FUNCTION  
程序中使用 CHECK_ACCESS方法即可以检查数据访问安全性。
四、凭证导入

如果客户化程序需要通过总账接口来导入凭证,那需要注意导入凭证受到数据访问权限设置的控制,因此插入到GL_INTERFACE中的数据要充分考虑这点,一般可以采取如下方式:
  • 如果运行导入程序的职责不具备完全访问分类账的权限,那可以包装一下导入程序,在调用导入程序之前进行数据的过滤
  • 如果不希望受到数据访问权限的限制,也可以专门设置一个完整权限访问的职责,用它来进行凭证的导入

至此整个“总账数据访问安全性控制”系列已全部结束。
原文地址:http://Oracleseeker.com/2008/09/17/Oracle-general-ledger-data-access-security-briefing/
发表于 2011/12/29 08:17:41 | 显示全部楼层
关于账户组合录入时,可以看到其他公司段值,可以通过Security Rule屏蔽。
发表于 2012/1/9 17:01:48 | 显示全部楼层
好东西,再出个MO中的一些安全性控制描述就更好了
发表于 2012/2/9 15:24:11 | 显示全部楼层
我完全一模一樣的設定,怎么還是能看到別的平衡段的總帳傳票呢。。。。有人知道怎么回事嗎?
发表于 2012/2/9 15:26:45 | 显示全部楼层
1 新增一個data accsess set,叫80 only 設定用平衡段區別,對平衡段為80的傳票有read and write.
2 在profile里設XXX_GL_superuser的gl:data access sets的profile在repsonsibility層設成80 only
3 再換到XXX_GL_superuser下查詢,仍然能看到平衡段為50的傳票。
這是為什么,為什么。。。。
发表于 2012/3/6 08:55:56 | 显示全部楼层
真正的厉害
发表于 2012/3/6 14:10:06 | 显示全部楼层
学习了,谢谢
发表于 2012/5/13 20:01:26 | 显示全部楼层
学习中…………
发表于 2012/7/9 14:15:03 | 显示全部楼层
写得很详细,感谢分享
发表于 2012/7/31 14:47:50 | 显示全部楼层
纵横四海 发表于 2011/9/28 06:45
下面介绍数据访问安全性控制两个不足的地方

一、凭证查找

对于第二个问题可以通过弹性域下安全性规则进行屏蔽,设置一个规则包含一个值范围,再将这个规则分配给相应的责任就可以解决!
发表于 2012/8/1 07:55:57 | 显示全部楼层
楼主真厉害啊,正在寻找这方面的资料呢
发表于 2012/8/26 21:43:23 | 显示全部楼层
谢谢分享!
发表于 2013/7/4 14:10:35 | 显示全部楼层
写的很详细,谢谢分享
发表于 2013/7/11 13:39:57 | 显示全部楼层
学习吸收了,正好遇到相关的需求
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|手机版|壹佰网 ERP100 ( 京ICP备19053597号-2 )

Copyright © 2005-2012 北京海之大网络技术有限责任公司 服务器托管由互联互通
手机:13911575376
网站技术点击发送消息给对方83569622   广告&合作 点击发送消息给对方27675401   点击发送消息给对方634043306   咨询及人才点击发送消息给对方138011526

GMT+8, 2025/11/30 05:05 , Processed in 0.043009 second(s), 14 queries , File On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表