数据库权限结构

时间:2009-07-14 18:33:45

标签: sql-server performance permissions database-permissions

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

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

基本表结构如下;

tblUser {UserID,Username,WindowsLogonName}

tblGroup {GroupID,Name,Description,SystemFlag}

tblGroupGroup {GroupGroupID,Name,}

tblGroupUser {GroupUserID,Name,}

并将它们捆绑在一起;

tblPermission {PermissionID,SecurityObjectID,SecuredID,TableName,AllowFlag}

包含像..

这样的行

'5255-5152-1234-5678','{ID of a Group}','{ID for for tblJob}','tblJob',1

'4240-7678-5435-8774','{用户ID}','{tblJob中的内容ID}','tblJob',1

'5434-2424-5244-5678','{ID of a Group}','{ID for tblTask​​}'','tblTask​​',0

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

进一步使事情复杂化;如果明确拒绝用户访问某行,则会取消任何组权限。这完全在MSSQL中。

3 个答案:

答案 0 :(得分:0)

我猜测将tblPermission拆分成几个表是有用的:一个用于组,一个用于用户。通过同时拥有组和用户,似乎增加了设计的复杂性(也许这就是您需要存储过程的原因)。

如果你想分解tblPermission表(比如tblUserPermission和tblGroupPermission之类的东西),但仍想要表示看起来像tblPermission的表,你可以创建一个视图,即union是来自两个表的数据。

希望这会有所帮助。您是否有存储过程的示例?

答案 1 :(得分:0)

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

答案 2 :(得分:0)

也许您的设计没问题,但实现/代码是错误的。

一些想法:

  • 您的所有ID列都是GUID吗?不推荐Kimberley L Tripp article
  • 所有外键的索引,可能与key或INCLUDE中的其他列
  • 定期维护?例如碎片索引,统计数据等日期等
  • 是否所有数据类型都匹配(假定没有FK):数据类型优先级和隐式转换错误可能会在
  • 中蔓延

更多架构信息和效果不佳的代码示例可能有所帮助

相关问题