我的许多雇主的应用程序都有类似的内部权限结构,用于将数据限制在特定的用户或组中。组也可以嵌套。
这种方法目前面临的问题是,枚举权限的速度非常慢。当前方法使用具有多个游标和临时表的存储过程。这对于较小的应用程序是很好的,但是我们现在有一个特定的系统,它正在快速增长,并且它开始减速。
表的基本结构如下;
tblUser { UserID,用户名,WindowsLogonName }
tblGroup { GroupID,名称,描述,SystemFlag }
tblGroupGroup { GroupGroupID,Name,}
tblGroupUser { GroupUserID,Name,}
把一切都绑在一起;
tblPermission { PermissionID,SecurityObjectID,SecuredID,TableName,AllowFlag }
其中包含行,如..。
'5255-5152-1234-5678',‘{组的ID}’,‘{tblJob}中某物的{ID’,‘tbl作业’,1
'4240-7678-5435-8774‘、’{用户ID}‘、’{tblJob}中某样东西的{ID‘、’tbl作业‘、1
'5434-2424-5244-5678',‘{组的ID}’,‘{tblTask}中某物的{ID’,'tblTask',0
肯定有一种更有效的方法来枚举所有组,并获取安全行的ID?
如果用户被显式地拒绝了对一行的访问,那么这就否决了任何组权限。这都是在MSSQL中完成的。
发布于 2009-07-14 21:07:44
我猜将tblPermission分解成两个表是有用的:一个用于组,另一个用于用户。通过在其中同时包含组和用户,它似乎增加了设计的复杂性(也许这就是您需要存储过程的原因)。
如果您想将tblPermission表分解成类似于tblUserPermission和tblGroupPermission的表,但仍然想要一个类似于tblPermission的表的表示形式,那么您可以创建一个视图,它是来自这两个表的数据。
希望这能有所帮助。您有存储过程的示例吗?
发布于 2009-07-15 20:48:43
我认为您可以使用递推公共表表达式(CTE)分层查询。如果你搜索它,你可以找到很多例子。这就是其中之一。
发布于 2009-09-05 12:13:36
也许您的设计是可以的,但是实现/代码是错误的。
一些想法:
一些更多的模式信息和性能较差的代码示例可能会有所帮助。
https://stackoverflow.com/questions/1127168
复制相似问题