在sql server 2008中为组中的用户实现资源配额

时间:2012-03-02 19:10:04

标签: sql-server sql-server-2008 sql-server-2005 sql-server-2008-r2

有许多用户,用户可以参与的许多组。每个组都有一个资源配额。

表格如下:

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已经访问了该资源,他的总配额减少了一次(现在等于2),但我们不知道减少了哪个组配额(或者我们呢?)

所以问题是,如何在SQL Server 2005/2008中实现这个逻辑(甚至可能是Denali :)?

我们怎么知道用户#2实际上可以在剩余时间内访问该资源并强制用户#1的操作将他的组#1的配额减少1而不是组#2'?

如果它仍然对您有意义,请解决此问题。 :)我已经考虑了很长一段时间了。

为了说清楚,我希望在用户#1访问该资源之后立即使用单个select语句告诉我用户#2的配额是什么。 (提示:它应该仍然是1而不是0)

更新

用户#1拥有他所在的所有组的总配额,因此他对资源#1的配额为2 + 1 = 3;并且用户#2的资源#1的配额是1,因为他只是组#2的成员(其配额为1)。当来自任何组(具有访问资源的资源配额)的某人访问资源时,该资源的聚合配额会相应减少(与访问该资源的次数相同)。

更新2

配额减少规则如下:每次访问都应使用剩余配额最多的组。因此,在第一个示例中,当用户#1访问资源时,我们选择组#1,因为它的配额为2(大于1)。下一次,当用户#2访问资源时,我们选择任何组,因为他们都有1个访问权限的配额。这是缺少的业务规则。

1 个答案:

答案 0 :(得分:0)

我相信我明白你在问什么,但我相信你的逻辑存在缺陷。您正在询问如何减少组的可用使用量,但实际上,您正在计算用户组的可用资源可用性,并将其递减给用户,而不是组。

如果是这种情况,您将汇总组资源可用性,并减去用户的资源访问计数。

更新

根据您的上一条评论,我相信我们会在同一页面上。组中的所有用户都修复了组的配额 - 如果用户#3和用户#4仅在组#3中,其配额为2,则用户#3可以访问两次,用户#4可以访问两次,或者他们可以每次访问一次。

鉴于此,您尝试计算多个组中的用户访问资源时使用的组配额。

您正在尝试确定未经编写的业务规则的技术解决方案 - 用户从哪个组中获取配额?您需要首先在系统外定义,然后实现它是微不足道的。 应该哪个用户来自哪个组?它是基于组内的用户数量?该小组是否优先考虑?用户是否有首选组?等等。

在您了解业务规则之前,您实施的任何解决方案都是不可测试的 - 您没有任何可比性的解决方案。