【问题标题】:Database Permission Structure数据库权限结构
【发布时间】:2010-11-10 18:16:05
【问题描述】:

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

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

基本表结构如下;

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 of a User}', '{ID for something in tblJob}', 'tblJob', 1

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

肯定有更有效的方法来枚举所有组并获取安全行的 ID?

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

【问题讨论】:

  • 你使用的是什么版本的SQL Server;有一些建议,但它们取决于 sql server 的版本。看看负载较高的应用程序中的最终权限,您可能可以在您的选择上拆分检查以授予和拒绝,这可能会简化执行,因为我习惯于在我的应用程序中看到更多的授权。
  • SQL Server 2005。在哪里可以找到有关“负载较高的应用程序”的信息?

标签: sql-server performance permissions database-permissions


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的建议,尽管我认为拆分用户和组权限会使事情变得更加复杂,因为权限始终是基于用户和组计算的。我们还有一个定义合理的对象模型,它期望某些地方的东西。我已经把这个脚本放在一起,它似乎在枚举权限方面效果很好; pastebin.com/f3877c416 在一些测试中,它返回的行数与当前存储过程相同,但在
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    一些想法:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-31
      • 2015-03-08
      • 2012-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-05
      • 1970-01-01
      相关资源
      最近更新 更多