SQL объединяет и объединяет несколько таблиц - PullRequest
0 голосов
/ 14 сентября 2010

У меня есть следующие таблицы:

users
 - userid
 - real name
 - other stuff

roles
 - roleid
 - description
 - other stuff

functions
 - functionid
 - description

screens
 - screenid
 - description

Пользователь может иметь несколько ролей в соответствии с таблицей

user_roles
 - userid
 - roleid

Каждая роль может иметь редактирование, просмотр или отсутствие доступа к заданной функции, управляемой таблицей

role_functions
- roleid
- functionid
- status

status - это «E», если у роли есть разрешение на редактирование этой функции, «V», если у роли есть разрешение на просмотр для этой функции, и не может быть ни записи, либо записи со статусом «N», если роль не имеет разрешения для этой функции.

И, наконец, функция имеет несколько экранов, как указано в таблице

function_screens
 - functionid
 - screenid

Я знаю, что это довольно запутанный беспорядок, но требования к ролям, функциям и экранам исходят от разных подразделений, поэтому я не могу упростить его. Тем не менее, мне нужен запрос, который я могу направить в отдел контроля качества и другим лицам, которым присвоен идентификатор пользователя, они могут перечислить все экраны, а также определить, есть ли у них доступ к этому экрану: «Правка», «Просмотр» или «Нет». Если этот пользователь принадлежит к одной роли, которая дает ему разрешение «E» для функции, которая включает экран, и другой роли, которая дает ему разрешение «V» для функции, которая включает в себя тот же экран, тогда его разрешение на этот экран равно «E». .

Прямо сейчас я выполняю все эти поиски, используя набор Java-кода с Maps of Maps, но мне интересно, есть ли более простой способ сделать это в сценарии SQL.

1 Ответ

4 голосов
/ 14 сентября 2010

Попробуйте это:

select s.screenid, s.description
, CASE MAX(CASE rf.status WHEN 'E' THEN 2 WHEN 'V' THEN 1 ELSE 0 END)
    WHEN 2 THEN 'E'
    WHEN 1 THEN 'V'
    ELSE 'N' END as status
from user_roles ur
join role_functions rf on rf.roleid = ur.roleid
join function_screens fs on fs.functionid = rf.functionid
join screens s on s.screenid = fs.screenid
where ur.userid = :theuser
group by s.screenid, s.description
order by s.screenid

2 вложенных случая преобразуют E, V и N в 2, 1 и 0 и обратно, чтобы MAX можно было использовать для получения «наивысшего» статуса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...