总账数据访问安全性控制(5)
本文介绍在客户化开发的程序中需要考虑总账数据访问安全性的控制
一、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, :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
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中的数据要充分考虑这点,一般可以采取如下方式:
- 如果运行导入程序的职责不具备完全访问分类账的权限,那可以包装一下导入程序,在调用导入程序之前进行数据的过滤
- 如果不希望受到数据访问权限的限制,也可以专门设置一个完整权限访问的职责,用它来进行凭证的导入
至此整个“总账数据访问安全性控制”系列已全部结束,下面是系列文章的链接: