Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Циклические иерархии - правильно ли? +вопрос по реализации  [new]
Dmitry Gurianov
Member

Откуда:
Сообщений: 651
Приветы!
Всю голову сломал.
Имеются юзеры и группы, причем последние могут включать в себя как юзеров, так и группы. Членство выглядит так:
CREATE TABLE GroupMembership (GroupMembershipID, GroupID, GroupTypeID, MemberID, MemerTypeID)
Типы GroupTypeID и MemerTypeID нужны, т.к. группы и, собсно, члены групп бывают разных видов, но при этом могут участвовать друг в другие. Но не суть.
Допустим, меня зовут Дима и у меня есть группа "друзья Димы", в которую входят Вася, Петя, а также группа "друзья Маши". В то же время у Маши есть группа "друзья Маши", в которую входят Лена, Катя и группа "друзья Димы". Налицо имеем цикличную ссылаемость между мной и Машей. Везде написано, что цикличная иерархия - скорее всего ошибка. А можно ли в моем случае обойтись без нее?

Вопрос второй.
Имеется таблица привилегий субьекта (пользователя, группы и др.) на объекты:
CREATE TABLE Permission (PermissionID, SubjectID, SubjectTypeID, ObjectID, ObjectTypeID, PermissionTypeID, [Value])
Здесь каждому субьекту присваивается явное разрешение/запрет на объект.
В конечном итоге, чтобы определить права юзера на конкретный объект, надо поднять все его дерево членства в группах (GroupMembership), соединить его с привилегиями (Permission) и посмотреть наилучшее из самых близких к нему по иерархии GroupMembership разрешений.
Вроде бы нормальный подход, или я ошибаюсь?
В области определения прав пользователя нужно решить следующие задачи:
1) Определить право пользователя на объект
2) Определить все объекты, к которым пользователь имеет любые (или определенные) явные права
3) Определить всех пользователей, которые имеют любые (или определенные) явные права на заданный объект

Изначально хотел построить некое универсальное представление, соединяющее пользователя, объект и окончательное право (т.е. наилучшее из наиболее близких к нему по иерархии). Много раз пытался написать селект, но получалось, что для одной из перечисленных задач он оптимален, для другой - мегаплохой. То же самое, если писать функции. В конечном итоге, сломал голову и пока не знаю, как оптимально решить описанные выше задачи. Вроде бы тема должна быть популярной, т.к. часто приходится работать с иерархическим членством в группах и правами субъектов, но так и не смог найти в инете задачу, аналогичную моей и ее решения. Может, вы подскажете где поискать или укажете на ошибки в архитектуре?
Спасибо.
21 июл 11, 02:48    [11003901]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить