PL SQL Pivot Table VS Пользовательское решение Json - PullRequest
2 голосов
/ 10 мая 2011

Я нахожусь в одном из моих проектов 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, мне нужно было бы перейти к отчету любым способом, чтобы обновить число столбцов вручную, я считаю.

Я думаю, что это может быть "лучшим" решением на данный момент, если у кого-то нет других предложений ...

1 Ответ

2 голосов
/ 10 мая 2011

Для области отчета Apex, основанной на запросе динамического SQL, возможно возвращать различное количество столбцов при изменении запроса. Я установил простую демонстрацию на apex.oracle.com . Введите имя новой колонки в табличную форму Столбцы и нажмите «Добавить строку», и отчет «Матрица» будет перерисован с дополнительным столбцом с таким именем.

Вы должны:

  1. В основу отчета положена функция, которая возвращает SQL для запуска в виде строки
  2. Выберите атрибут региона «Использовать общие имена столбцов (запрос разбора только во время выполнения)»
  3. Установите тип заголовка отчета на PL / SQL, а затем используйте функцию для динамического возврата необходимых заголовков столбцов в виде списка, разделенного двоеточиями. Обратите внимание, что это может отличаться от имени столбца, хотя мой пример использует один и тот же текст для обоих.

Если мой пример недостаточно ясен, я добавлю больше информации позже - у меня сейчас нет времени.

...