我在我的一個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
這讓我返回user
,app
,並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的框架,我將不得不進入報告任何方式手動更新列數相信。
我想這可能是現在的「最佳」的解決方案,除非任何人有任何其他建議...
Oracle在11g之前不支持PIVOT - 換出'CASE'的DECODE是唯一可以做出的改變。並且數據庫會比客戶端計算得更快... – 2011-05-10 14:45:16
我知道10g中缺少PIVOT,但我一直在尋找其他方式來使用表類型和/或流水線函數來循環10g中的數據。我仍然對這種工作模糊不清,但這正是我所傾向的。 – Patrick 2011-05-10 15:01:58
目前尚不清楚你到底在做什麼?你的表結構是什麼? – jny 2011-05-10 15:18:39