1

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

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

基本表结构如下;

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

tblGroup { GroupID、名称、描述、SystemFlag }

tblGroupGroup { GroupGroupID,名称,}

tblGroupUser { GroupUserID,名称,}

并将它们捆绑在一起;

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

其中包含行,如..

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

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

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

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

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

4

3 回答 3

0

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

如果您想分解 tblPermission 表(分解为 tblUserPermission 和 tblGroupPermission 之类的东西),但仍然想要一个看起来像 tblPermission 的表的表示,您可以创建一个视图,将两个表中的数据联合起来。

希望这可以帮助。你有存储过程做什么的例子吗?

于 2009-07-14T21:07:44.373 回答
0

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

于 2009-07-15T20:48:43.837 回答
0

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

一些想法:

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

更多模式信息和性能不佳的代码示例可能会有所帮助

于 2009-09-05T12:13:36.460 回答