Я нахожусь в одном из моих проектов 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 возвращает более 303 тыс. строк. в настоящее время почти 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, где я буду собирать строку json с использованием pl sql и возвращать всю строку клиенту для обработки через jquery.
Я обеспокоен сложностью первого варианта (я очень плохо знаком с pl sql, и я не уверен, как создать сводную таблицу для использования в этой версии oracle (v 10)) и Я обеспокоен расходами на создание целой строки json, которая будет содержать столько данных.
Любые предложения будут с благодарностью.
EDIT
Я достиг желаемой сводной таблицы с помощью следующего 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, мне нужно было бы перейти к отчету любым способом, чтобы обновить число столбцов вручную, я считаю.
Я думаю, что это может быть "лучшим" решением на данный момент, если у кого-то нет других предложений ...