我的许多雇主应用程序共享一个类似的内部权限结构,用于将数据限制为特定的一组用户或组。组也可以嵌套。
我们目前使用这种方法遇到的问题是枚举权限非常慢。当前方法使用具有许多游标和临时表的存储过程。这适用于较小的应用程序,但我们现在有一个特定的系统正在快速增长,并且开始放缓。
基本表结构如下;
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中。
答案 0 :(得分:0)
我猜测将tblPermission拆分成几个表是有用的:一个用于组,一个用于用户。通过同时拥有组和用户,似乎增加了设计的复杂性(也许这就是您需要存储过程的原因)。
如果你想分解tblPermission表(比如tblUserPermission和tblGroupPermission之类的东西),但仍想要表示看起来像tblPermission的表,你可以创建一个视图,即union是来自两个表的数据。
希望这会有所帮助。您是否有存储过程的示例?
答案 1 :(得分:0)
答案 2 :(得分:0)
也许您的设计没问题,但实现/代码是错误的。
一些想法:
更多架构信息和效果不佳的代码示例可能有所帮助