Внедрение квот ресурсов для пользователей в группах в SQL Server 2008 - PullRequest
0 голосов
/ 02 марта 2012

Есть много пользователей, много групп, в которые пользователи могут входить. Каждая группа имеет квоту ресурсов.

Таблицы следующие:

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 доступ. Это бизнес-правило, которое отсутствовало.

1 Ответ

0 голосов
/ 02 марта 2012

Полагаю, я понимаю, о чем вы спрашиваете, но я верю, что в вашей логике есть недостаток.Вы спрашиваете, как уменьшить доступное использование для группы, но в действительности вы рассчитываете доступность доступных ресурсов по группам пользователей и уменьшаете его для пользователя, а не для группы.

Если это так,вы бы суммировали доступность ресурсов вашей группы и вычитали количество обращений к ресурсам пользователя.

ОБНОВЛЕНИЕ

На основании вашего последнего комментария я полагаю, что мы попадаем на ту же страницу.Квота группы фиксирована для всех пользователей в группе - если пользователь № 3 и пользователь № 4 находятся только в группе № 3, которая имеет квоту 2, пользователь № 3 может получить доступ дважды, пользователь № 4 может получить доступ дважды, или ониможет каждый получить доступ один раз.

Учитывая это, вы пытаетесь вычислить, какая квота группы используется, когда пользователь в нескольких группах обращается к ресурсу.

Вы пытаетесь определить техническое решение для неписаного бизнес-правила - какую квоту группы получает пользователь?Сначала нужно определить это вне системы, а затем реализовать его тривиально.Из какой группы должен получить пользователь?Это основано на количестве пользователей внутри группы?Есть ли у группы приоритет?Есть ли у пользователя предпочтительная группа?и т. д. и т. д.

Пока вы не знаете бизнес-правило, любое решение, которое вы внедрите, не поддается проверке - вам не с чем сравнивать.

...