我正处于我的一个Oracle APEX项目中,我需要针对特定应用程序为特定个人实施不同级别的安全性。
首先,我创建了一个笛卡尔,其中包含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毫秒内返回,这是可以接受的。
现在,我还有一个存储每个用户的应用程序/角色分配的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(v 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 :(得分:2)
基于动态SQL查询的Apex报表区域可能会在查询更改时返回不同数量的列。我已经设置了一个简单的演示on apex.oracle.com。在“列”表格形式中键入新列名称,然后按“添加行”,并使用该名称的额外列重新绘制Matrix报告。
你必须:
如果我的例子不够清楚,我会在以后添加更多信息 - 我现在没时间了。