2011-05-10 58 views
2

我在我的一個Oracle APEX項目中需要爲特定應用程序的特定個人實現不同級別的安全性。PL SQL數據透視表VS自定義Json解決方案

首先,我創建了一個包含user表,app表和role表中的信息的笛卡爾。

它看起來像這樣:

SELECT 
A.user_id, B.app_id, C.role_id 
FROM user A, app B, role C 
ORDER BY A.user_id ASC, B.app_id ASC, C.role_id ASC 

這讓我返回userapp,並role每個組合。無/使用where子句它返回超過303k行。目前差不多有500個用戶,6個角色和100多個應用程序。

當我從這個視圖中選擇一個特定的用戶時,它在大約10 ms內返回,這是可以接受的。

現在,我也有一個存儲每個用戶的應用程序/角色分配的vw。我以下列方式將此表加入笛卡爾。

SELECT 
A.*, 
DECODE(B.app_right_id, null, 0, 1) AS user_access 
FROM 
      vw_user_app_role A -- My cartesian view 
LEFT JOIN vw_tbl_user_app_role B 
     ON A.user_id = B.user_id 
     AND A.app_id = B.app_id 
     AND A.role_id = B.role_id 

這會返回一個非常有用的數據集,類似於

user_id app_id role_id user_access 
50  5  1  0 
50  10  2  1 
50  15  3  1 
75  5  1  1 
75  10  2  0 
75  15  3  0 

我正在考慮什麼我的下一個步驟應該是,如果我要創建數據的樞軸,其中APP_ID將是行,role_id將是列,並且user_access將是「數據」。 「數據」最終將作爲一個複選框呈現在網站上,並帶有適當的行/列標題。

我也在考慮使用純ajax/json解決方案,我將使用pl sql構建json字符串,並將整個字符串返回給客戶端,以便通過jquery進行處理。我很關心第一個選項的難度(我對pl sql非常陌生,而且我不確定如何生成一個在這個版本的oracle中使用的數據透視表(第10版))我關心的是創建一個包含這麼多數據的整個json字符串。

任何建議將不勝感激。

編輯

我已經實現了我通過以下SQL所需的數據透視表:

SELECT 
B.application_nm, 
A.user_id, 
MAX(DECODE(b.role_name, 'role 1', A.USER_ACCESS, NULL)) "role 1", 
MAX(DECODE(b.role_name, 'role 2', A.USER_ACCESS, NULL)) "role 2", 
MAX(DECODE(b.role_name, 'role 3', A.USER_ACCESS, NULL)) "role 3", 
MAX(DECODE(b.role_name, 'role 4', A.USER_ACCESS, NULL)) "role 4", 
MAX(DECODE(b.role_name, 'role 5', A.USER_ACCESS, NULL)) "role 5", 
MAX(DECODE(b.role_name, 'role 6', A.USER_ACCESS, NULL)) "role 6" 
FROM 
vw_user_app_access A LEFT JOIN vw_tbl_app B ON A.app_id = B.app_id 
LEFT JOIN vw_tbl_roles C ON A.role_id = C.role_id 
GROUP BY B.application_name, A.user_id 
ORDER BY A.user_id DESC 

唯一的問題是,當在未來,我們必須添加的角色7「。我不得不回到這個查詢並添加行MAX(DECODE(b.role_name, 'role 7', A.USER_ACCESS, NULL)) "role 7"

提前思考,這可能是一個不便,但考慮APEX的框架,我將不得不進入報告任何方式手動更新列數相信。

我想這可能是現在的「最佳」的解決方案,除非任何人有任何其他建議...

+0

Oracle在11g之前不支持PIVOT - 換出'CASE'的DECODE是唯一可以做出的改變。並且數據庫會比客戶端計算得更快... – 2011-05-10 14:45:16

+0

我知道10g中缺少PIVOT,但我一直在尋找其他方式來使用表類型和/或流水線函數來循環10g中的數據。我仍然對這種工作模糊不清,但這正是我所傾向的。 – Patrick 2011-05-10 15:01:58

+0

目前尚不清楚你到底在做什麼?你的表結構是什麼? – jny 2011-05-10 15:18:39

回答

2

有可能基於動態的SQL查詢返回不同的頂點報表區域查詢更改時的列數。我已經建立了一個簡單的演示on apex.oracle.com。在「列」列表中輸入一個新列名稱,然後按下「添加行」,然後使用該名稱的額外列重新繪製Matrix報表。

你必須:

  1. 基礎上返回的SQL來運行作爲一個字符串
  2. 選擇區域屬性「使用通用列名(在運行時分析查詢只)」函數報告
  3. 將報表標題類型設置爲PL/SQL,然後使用函數將所需的列標題動態返回爲冒號分隔的列表。請注意,這可能與列名不同,儘管我的示例對兩者使用相同的文本。

如果我的例子不夠清楚,我會在稍後添加更多信息 - 現在我已經沒有時間了。