【发布时间】:2013-11-17 00:16:10
【问题描述】:
最近,我负责清理 SQL Server 2008 数据库和网站代码,但在想出一个优雅的解决方案来解决以下问题时遇到了麻烦。在网站上,有不同角色的用户,每个角色都有多个权限。网站上的管理员可以启用或禁用给定角色的权限。
目前,数据库未规范化,表设置如下:
角色:
RoleID | RoleName | Permissions
1 | Admin | 1;2;3;4;5;etc.
2 | User | 4;23;54;etc.
3 | Person | 54;2;3;45;etc.
权限:
PermissionID | PermissionName
1 | Random Name
2 | You get the idea
3 | etc.
要更新角色权限,他们基本上会遍历代码隐藏中的每个复选框,生成“权限字符串”并在单个调用中更新行。
我想将数据库标准化如下:
角色:
RoleID | RoleName
1 | Admin
2 | User
3 | Person
权限:
PermissionID | PermissionName
1 | Random Name
2 | You get the idea
3 | etc.
角色权限:
rpID | RoleID | PermissionID
1 | 1 | 1
2 | 1 | 2
3 | 1 | 20
4 | 2 | 5
5 | 2 | 2
问题是用户可能希望一次更改 20-30 个权限。我能想到的唯一方法是删除该角色的每个权限,然后逐个添加每个角色-权限关系。通常这不会是一个问题,但我们的数据库存储在与我们的代码不同的服务器上,因此单独执行 30 多个命令中的每一个的网络延迟将是一个杀手。我也知道在这种情况下,用户应该很少更新角色,但我正在尝试将整个数据库切换为规范化,所以这个问题会出现在更常用页面的其他地方。
我想知道是否有一种优雅的方式在一两个 SQL 命令中将新的 Role-Permission 关系插入到 RolePermissions 表中(如果它们不存在),并删除任何不再存在的 RolePermissions。这背后的代码是 C#,所以我可以很容易地生成所需的任何 SQL 命令字符串。有什么建议吗?
如果需要更多信息,我会提供。
【问题讨论】:
标签: c# sql sql-server sql-server-2008-r2 relational-database