總帳數據訪問安全性控制

數據訪問權限集(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. 若是不但願受到數據訪問權限的限制,也能夠專門設置一個完整權限訪問的職責,用它來進行憑證的導入
相關文章
相關標籤/搜索