2009-07-14 106 views
1

我的许多雇主应用程序共享一个类似的内部权限结构,用于将数据限制为特定的一组用户或组。组也可以嵌套。数据库权限结构

我们目前使用这种方法面临的问题是枚举权限非常慢。当前方法使用具有许多游标和临时表的存储过程。这对于较小的应用程序来说工作得很好,但我们现在有一个特定的系统正在快速增长,并且它开始放慢速度。

基本表结构如下;

tblUser {用户ID,用户名,WindowsLogonName}

tblGroup {的GroupID,名称,说明,SystemFlag}

tblGroupGroup {GroupGroupID,名称}

tblGroupUser {GroupUserID,Name,}

并将它们连接在一起;

tblPermission {PermissionID,SecurityObjectID,SecuredID,表名,AllowFlag}

包含行像..

'5255-5152-1234-5678', '{组的ID}' ,'{ID for something in tblJob}','tblJob',1

'4240-7678-5435-8774','{用户的ID}','{用于tblJob中的东西}',' tblJob',1

'5434-2424-5244-5678','{组的ID'','{ID for在tblTask​​}','tblTask​​',0

当然,必须有一个更有效的方法来枚举所有的组,并获得安全行的ID?

使事情进一步复杂化;如果用户明确拒绝访问某一行,则这将否决任何组权限。这一切都在MSSQL中。

+0

您使用的是什么版本的SQL服务器;有几个建议,但他们依赖于SQL Server的版本。 看看更高负载应用程序中的最终权限,您可能能够将支票拆分为授予和拒绝您的选择,这可能会简化执行,因为我习惯于在应用程序中看到比denys更多的授予。 – u07ch 2009-07-14 21:07:54

+0

SQL Server 2005.我在哪里可以找到有关“更高负载应用程序”的信息? – 2009-07-15 08:08:58

回答

0

我猜测将tblPermission分解成几个表是有用的:一个用于组和一个用户。通过将组和用户放在那里,似乎会增加设计的复杂性(也许这就是为什么您需要存储过程)。

如果您想要分解tblPermission表(类似于tblUserPermission和tblGroupPermission),但仍希望表示类似于tblPermission的表,您可以制作一个视图,即union是来自这两个表的数据。

希望这会有所帮助。你有存储过程的例子吗?

0

我认为你可以使用Recursive公用表表达式(CTE)进行分层查询。你可以找到很多例子,如果你搜索它。 This就是其中之一。

0

也许你的设计是好的,但实现/代码是错误的。

的几点思考:

  • 是否所有的ID列GUID?不建议使用Kimberley L Tripp article
  • 所有外键索引,或许与其他列键或INCLUDE
  • 定期维护?例如索引碎片,统计OT日期等
  • 是否所有的数据类型匹配(假定没有FKS):数据类型的优先级和隐式转换误差

的蠕变现象,一些更多的架构信息和业绩不佳的代码示例可以帮助