Есть много пользователей, много групп, в которые пользователи могут входить. Каждая группа имеет квоту ресурсов.
Таблицы следующие:
User: UserId, LastName, FirstName, ...
Group: GroupId, GroupName, ...
UserGroup: GroupId, UserId (Users are in Groups)
Resource: ResourceId, ResourceName, ...
GroupResource: GroupId, ResourceId, Quota (Users in Groups can access certain Resources specified Quota times)
UserResourceAccess: UserId, ResourceId, InsertDate, ...
Конечно, существуют ежедневные и ежемесячные квоты, но для целей этого вопроса это не имеет значения.
Таким образом, когда пользователь № 1 (находящийся в группах № 1, № 2 с квотами ресурсов 2 и 1 соответственно) получает доступ к ресурсу № 1, его общая квота для этого ресурса должна быть уменьшена на 1: (1 + 2) - 1 = 2 (осталось времени для доступа).
Но затем есть еще один пользователь # 2, который является членом группы # 2, и он пытается получить доступ к ресурсу # 1 ...
Вот интересная часть: пользователь # 1 уже обращался к этому ресурсу, и его общая квота была уменьшена 1 раз (что теперь равно 2), но мы не знаем, какая групповая квота была уменьшена (или мы?)
Итак, вопрос в том, как реализовать эту логику в SQL Server 2005/2008 (может быть, даже Denali:)?
Как мы можем знать, что пользователь # 2 может фактически получить доступ к этому ресурсу за оставшееся время и заставить действие пользователя # 1 уменьшить квоту для своей группы # 1 на 1, а не для группы # 2 '?
Если для вас это все еще имеет смысл, пожалуйста, решите эту проблему. :) Я уже давно об этом думаю.
Просто чтобы прояснить, я хочу иметь один оператор выбора, который бы сообщал мне, какая квота пользователя № 2 сейчас, сразу после того, как пользователь № 1 получил доступ к этому ресурсу. (подсказка: все равно должно быть 1, а не 0)
Обновление
Пользователь # 1 имеет совокупную квоту для всех групп, в которые он входит, следовательно, его квота для ресурса # 1 составляет 2 + 1 = 3; и квота пользователя № 2 для ресурса № 1 равна 1, потому что он является только членом группы № 2 (которая имеет квоту 1). Когда кто-либо из вашей группы (у которого есть квота ресурса для доступа к ресурсу) получает доступ к ресурсу, ваша совокупная квота для этого ресурса соответственно уменьшается (во столько раз, сколько к этому ресурсу обращались).
Обновление 2
Правило сокращения квот следующее: для каждого доступа должна использоваться группа с наибольшим количеством оставшейся квоты. Итак, в первом примере, когда пользователь # 1 обращается к ресурсу, мы выбираем группу # 1, потому что у него есть квота 2 (что> 1). И в следующий раз, когда пользователь # 2 получает доступ к ресурсу, мы выбираем любую группу, потому что у них обоих остается квота в 1 доступ. Это бизнес-правило, которое отсутствовало.