总账数据访问安全性控制

数据访问权限集(Data Access Set)介绍

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

系统中可以定义如下三种类型的数据访问权限集:

  1. 全部分类账
  2. 平衡段值(BSV)
  3. 管理段值(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自动生成数据访问权限集:

  1. 创建一个分类账
  2. 定义一个分类账集

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

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

一、定义数据访问权限集

路径:总账超级用户–>设置–>财务系统–>数据访问权限集

定义数据访问权限集有以下主要3个步骤:

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

定义示例

1)全部分类账类型

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

总账数据访问安全性控制

2)平衡段值类型

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

总账数据访问安全性控制

二、分配数据访问权限集给职责

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

总账数据访问安全性控制

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

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

总账数据访问安全性控制

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

总账数据访问安全性控制

其它较细节的功能就留给读者自己去试验了。

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

一、凭证查找

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

总账数据访问安全性控制

注:此凭证通过具有权限的职责查询出来

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

总账数据访问安全性控制

总账数据访问安全性控制

二、账户组合录入

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

总账数据访问安全性控制

总账数据访问安全性控制

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

一、凭证导入失败

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

二、无法打开会计期

无法打开会计期,打开会计期的按钮是灰色的,如下图:

总账数据访问安全性控制

这是由于用户的职责不具备完全访问分类账数据的权限,只要切换到具备完整数据访问权限的职责即可打开会计期了。

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

一、Form界面开发

如果Form界面中需要引用账户组合,同时希望账户组合受到数据安全性控制,需要增加如下的工作:

  1. 添加GLCORE.pll库文件到Form中
  2. 在账户组合字段的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, :LINES.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

me:  

SELECT *
  FROM gl_je_batches_headers_v
WHERE chart_of_accounts_id = 50348
   AND period_set_name = 'CAL_GL'
   AND accounted_period_type = '21'
   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 = '101田艳2013/08/19 09:11:17')
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))

me:

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中的数据要充分考虑这点,一般可以采取如下方式:

  1. 如果运行导入程序的职责不具备完全访问分类账的权限,那可以包装一下导入程序,在调用导入程序之前进行数据的过滤
  2. 如果不希望受到数据访问权限的限制,也可以专门设置一个完整权限访问的职责,用它来进行凭证的导入