2013-08-17 3 views
0

Я хотел бы реализовать базу данных, содержащую иерархические данные аКЛSQL Server: Сохранение Иерархическая ACL данных

Мои таблицы

  • USERS: idUser, имя пользователя, ...
  • GROUPS: idGroups, имя. ..
  • GROUPSENTITIES: idGroup, idChild, childType (1 пользователей, 2 из групп)
  • ROLES: idRole, имя ...
  • ROLESENTITIES: idRole, IsDeny, idChild, childType (1 пользователей, 2 из групп)

  • Каждый пользователь может принадлежать к 0 или более групп

  • Каждая группа может принадлежать 0 или более групп
  • каждый пользователь и каждая группа может принадлежать 0 или более ролей и ролей может быть разрешен или запрещен
  • Если явного отклонения обнаруживается, роль отрицается

Как хранить данные такого типа? Является ли мой дизайн правильным?

Возможно ли получить список пользователей со всеми разрешенными ролями?

Можете ли вы написать мне запрос (T-SQL основе) для экстракта этой информации из БД

заранее спасибо

ответ

0

Вы можете написать таблицы, как можно было бы ожидать. Например, чтобы получить всех пользователей в группе, когда есть иерархические группы, вы должны использовать рекурсивный CTE. Предположим, что таблица групп настроена как:

create table groups (
    groupid int, 
    member_userId int, 
    member_groupid int, 
    check (member_userId is NULL or member_groupid is null) 
); 

with usergroups as (
     select groupid, member_userid, 1 as level 
     from groups 
     union all 
     select g.groupid, users.member_userid, 1+level 
     from users u join 
      groups g 
      on u.member_groupid = g.groupid 
    ) 
select * 
from usergroups; 
+0

не могли бы вы лучше объяснить? как насчет ролей? GROUPENTITIES является кросс-платформой для объединения GROUPS и USERS, а также GROUPS с GROUPS (если childType = 1, childId содержит userId, если childType = 2, тогда и childId содержит groupId). как я могу запросить эту структуру с помощью cte? – user2277672

+0

извините, но не могу опубликовать DDL таблицы имя столбца название локализовано ... :( – user2277672