总帐数据访问安全性控制

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

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

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

  1. 所有分类帐
  2. 平衡段值(BSV)
  3. 管理段值(MSV)

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

平衡段值(Balancing Segment Values/BSV):
受权用户存取全部或者某些特定分类帐平衡段值的帐户组合。譬如,能够定义一个数据访问权限集来控制分类帐A的数据读取:对平衡段值01只有读取权限;对平衡段值02具备读写权限;而对于平衡段值03则没有读写的权限this

管理段值(Management Segment Values/MSV):
受权用户存取全部或者某些特定分类帐管理段值的帐户组合。譬如,能够定义一个数据访问权限集来控制分类帐A的数据读取:对管理段值100只有读取权限;对平衡段值200具备读写权限;而对于平衡段值300则没有读写的权限。要启用管理段的控制必须帐户结构定义中指定了管理段code

知足下列条件时,Oracle General Ledger自动生成数据访问权限集:orm

  1. 建立一个分类帐
  2. 定义一个分类帐集

系统为分类帐生成的数据访问权限集和分类帐同名,这个权限集使用了“所有分类帐”的访问权限集类型,提供了彻底读写整个分类帐数据的权限。接口

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

 

1、定义数据访问权限集开发

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

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

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

定义示例

1)所有分类帐类型

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

gl_access_set_full_ledger_define

2)平衡段值类型

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

gl_access_set_bsv_define

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

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

gl_access_set_assign_resp

3、登陆系统验证安全性控制

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

gl_access_set_journal_entry

切换到职责:General Ledger, AroneZhang,再次查询凭证信息,因为凭证行帐户组合的平衡段都是03,所以没法查找出凭证信息:

gl_access_set_journal_find_no_result

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

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

1、凭证查找

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

gl_access_set_journal_entry

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

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

gl_access_set_journal_entry_find

gl_access_set_journal_find_no_result

2、帐户组合录入

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

gl_access_set_gcc_segment_val

gl_access_set_gcc_no_access

 

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

1、凭证导入失败

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

2、没法打开会计期

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

gl_access_set_cannot_open_period

这是因为用户的职责不具有彻底访问分类帐数据的权限,只要切换到具有完整数据访问权限的职责便可打开会计期了。

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

 

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

2、SQL编写

若是但愿编写的SQL执行结果受到数据安全性的控制,须要特别添加限制。

1)凭证相关

若是在程序中但愿SQL取出的凭证数据受到数据安全性的控制,那须要链接数据库表

GL_JE_SEGMENT_VALUES来过滤数据,主要的字段:

je_header_id:凭证头ID
segment_type_code:段值类型,有B表明平衡段;M表明管理段
segment_value:段值

表关系图:

gl_access_set_je_erd

同时检查数据安全性设置表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_xla_erd

同时检查数据安全性设置表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)*/)

3、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方法便可以检查数据访问安全性。

4、凭证导入

若是客户化程序须要经过总帐接口来导入凭证,那须要注意导入凭证受到数据访问权限设置的控制,所以插入到GL_INTERFACE中的数据要充分考虑这点,通常能够采起以下方式:

  1. 若是运行导入程序的职责不具有彻底访问分类帐的权限,那能够包装一下导入程序,在调用导入程序以前进行数据的过滤
  2. 若是不但愿受到数据访问权限的限制,也能够专门设置一个完整权限访问的职责,用它来进行凭证的导入
相关文章
相关标签/搜索