4

我们正在使用 mysql。假设我们有一个 Adjacency List 模型表。(我知道它没有被规范化。)例如,具有以下字段的人员表:

Personnel
|employee|boss    |salary|
--------------------------
|CEO     |null    |999999|
|boss1   |CEO     |99    |
|boss2   |CEO     |99    |
|slvdrvr1|boss1   |9     |
|slvdrvr2|boss1   |9     |
|slave1  |slvdrvr1|1     |
|slave2  |slvdrvr1|1     |
|slave3  |slvdrvr1|1     |
|slave4  |slvdrvr2|1     |
|slave5  |boss2   |1     |
|slave6  |boss2   |1     |

我们还有一张桌子,里面有一些用户。例如,

Uers
|userid|role   |
----------------
|super1|b1     |
|super2|b2     |
|user1 |sd     |
|ruut  |admin  |

假设工资信息是保密的。因此,一些用户可以从某个分支看到工资信息。

例如,角色 b1 可以查看/编辑老板 1 及以下的所有工资。角色 b2 可以查看/编辑老板 2 及以下的所有工资。角色 sd 可以查看/编辑 slvdrvr1 和 slvdrvr2 及以下的所有工资。因此,我们需要设置一个用户-人员权限表来实现这一点。

Personnel 表很大,有数万行。

我的问题是我们如何设置一个我们可以轻松维护和查询的权限表?

例如,选项 1:我们可以为每个人设置角色权限。但是,权限表会很大。

选项2:我们只能为父节点设置角色权限。但是,每次用户想要查看一定数量的记录时,我们都必须为每条记录查找权限,一直到我们有设置的地方。

用户数约为数百。角色数量少于 100。

如果不清楚,请向我提问。提前致谢。

4

1 回答 1

1

为了让生活更有趣,考虑在用户之间也有一个树形结构!

开始实现,创建另一个表“User_EMPL_ACCESS”,它应该如下所示:

表 USER_EMPL_ACCESS( User_ID char(..), ACCESS_PATH char(..) )

在访问路径中,存储每个用户有资格查看的最顶层节点的完全限定路径。

然后,开发一个名为 hasAccess (userID, EMPLID) 的 UDF。

hasAccess 函数应该执行以下操作:

  1. 从用户 ID 开始
  2. 从 USER_EMPL_ACCESS 获取用户的访问路径
  3. 使用 CTE 逻辑将邻接表扩展为完全限定的路径。如果您的数据库不提供 CTE,请将 Adjacency Model 转换为 NestedSet 模型。
  4. 获取用户访问路径和邻接路径的交集,从根开始
  5. 如果输入 EMPLID 是上述任意交叉路径的叶节点,则返回 1,否则返回 0。

现在您的查询如下所示:

    select * from SALARY_TABLE where MONTH = 'JAN' 
    and hasAccess('myUserID', SALARY_TABLE.EMPLID) = 1
于 2012-08-21T16:23:37.153 回答