Sql server 数据库权限结构

Sql server 数据库权限结构,sql-server,performance,permissions,database-permissions,Sql Server,Performance,Permissions,Database Permissions,我的许多雇主应用程序共享类似的内部权限结构,用于将数据限制到特定的一组用户或组。组也可以嵌套 这种方法目前面临的问题是,枚举权限的速度非常慢。当前方法使用具有许多游标和临时表的存储过程。这对于较小的应用程序来说效果很好,但我们现在有一个特定的系统正在快速增长,并且它开始减速 表的基本结构如下: tblUser{UserID,Username,WindowsLogonName} tblGroup{GroupID,Name,Description,SystemFlag} tblGroupGroup{

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

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

表的基本结构如下:

tblUser{UserID,Username,WindowsLogonName}

tblGroup{GroupID,Name,Description,SystemFlag}

tblGroupGroup{groupid,Name,}

tblGroupUser{GroupUserID,Name,}

并把它们联系在一起

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

其中包含像..这样的行

‘5255-5152-1234-5678’,‘组的ID}’,‘tblJob中某物的ID}’,‘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中。

我猜将tblPermission分解为两个表会很有用:一个用于组,一个用于用户。通过将组和用户都包含在其中,似乎增加了设计的复杂性(这可能就是您需要存储过程的原因)

如果您希望分解tblPermission表(分为类似tblUserPermission和tblGroupPermission的内容),但仍然希望表的表示形式类似于tblPermission,则可以创建一个视图,将两个表中的数据合并


希望这有帮助。您有存储过程的示例吗?

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

也许您的设计还可以,但实现/代码是错误的

一些想法:

  • 您的所有ID列都是GUID吗?不推荐
  • 所有外键上的索引,可能在键或INCLUDE中包含其他列
  • 定期保养?例如碎片索引、日期统计等
  • 是否所有数据类型都匹配(假设没有FKs):数据类型优先级和隐式转换错误可能会逐渐出现

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

您使用的是什么版本的SQL server;我有一些建议,但它们取决于sql server的版本。查看高负载应用程序中的最终权限。您可以在选择时拆分检查以授予和拒绝,这可能会简化执行,因为我习惯于在我的应用程序中看到比deny更多的授予。SQL Server 2005。我在哪里可以找到“更高负载应用程序”的信息?谢谢你的建议,尽管我认为将用户和组权限分开会使事情更加复杂,因为权限总是根据用户和组计算的。我们还有一个定义合理的对象模型,可以在某些地方进行预期。我编写了这个脚本,它在枚举权限方面似乎很好;在一些测试中,它返回的行数与当前存储过程的行数相同,但是