0

我有两张桌子:

nets_permissions

    user_id INT NOT NULL,
    network_id BIGINT UNSIGNED NOT NULL,
    perm INT(3) NOT NULL,
    PRIMARY KEY(user_id, network_id)


devices_permissions

    user_id INT NOT NULL,
    network_id BIGINT UNSIGNED NOT NULL,
    device_id INT UNSIGNED NOT NULL,
    perm INT(3) NOT NULL,
    PRIMARY KEY(user_id, network_id, device_id),

nets_permissions table每个用户都有权限。一个用户可以有不同的 perm 值:1 表示读取权限,2 表示写入权限,4 表示读取+命令权限。网络管理员的 perm 值为 3。

第二个表也是如此,但这次是针对特定网络中的设备。当网络和设备的管理员授予用户权限时,用户将被添加到此表中。但是该网络的管理员未在此表中注册。他只在 perm=3 的 nets_permission 表中。

我必须在 Tornado Web 服务器的处理程序中创建一个选择当前用户权限的查询。代码是这样的形式:

# Retrieve the current user 
    usr = self.get_current_user()
    usr_id = usr['id']
    self.lock_tables("read", ['nets_permissions as n, devices_permissions as d'])
    usrperm = self.db.query("SELECT * FROM nets_permissions as n 
         LEFT OUTER JOIN devices_permissions as d 
              ON n.network_id = d.network_id WHERE d.user_id=%s 
                 AND d.device_id=%s", 
         int(usr_id), sens.id);
    self.unlock_tables()

在 usr_id 我检索的是当前用户的 id。

当前用户可以是网络的管理员(因此他仅在 nets_permissions 表中,perm=3)或对特定设备具有某些权限的用户(因此他仅在 devices_permissions 表中,具有某些 perm 值)。

在查询结果“userperm”中,我将使用一个整数在 html 页面中与权限值进行比较,并向用户显示或不显示某些内容。

对不起我的英语,但很难为我解释这个问题。我不知道我可以构造查询以获得我想要的结果。

非常感谢您的帮助。

4

2 回答 2

1
SELECT distinct 'net', network_id, perm
FROM nets_permissions n
JOIN devices_permissions d
USING (user_id, network_id)
WHERE n.user_id = '%s'
AND d.device_id = '%s'

UNION ALL

SELECT 'device', network_id, perm
FROM devices_permissions
WHERE user_id = '%s'
AND device_id = '%s'

但是,您的数据模型似乎存在问题。如果设备没有用户对该设备具有权限,则 不会有一行devices_permissions,因此我们将无法找到它的network_id. 您需要更好地规范这一点:应该有一个device_network表格来关联它们。

于 2012-10-12T15:40:30.043 回答
1

由于用户可以在一个或两个表中,您可能希望执行 UNION 而不是 Join。

Union 语句的工作方式如下:

select * from (
   Select User_ID, network_id, network_id, perm from nets_permissions
   union
   Select User_ID, network_id, device_id, perm from devices_permissions)
where user_id = 'id'

上述格式为您提供了更大的灵活性。您可以进一步修改外部选择,使每个用户只有一行,或者每个用户的最高权限,或者每个用户的权限总数等。

于 2012-10-12T14:27:58.120 回答