0

私は2つのテーブルを持っています:

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は読み取り+コマンド権限です。ネット管理者のパーマ値は3です。

2番目の表についても同じですが、今回は特定のネットにあるデバイスについてです。ネットとデバイスの管理者がユーザーに許可を与えると、ユーザーはこのテーブルに追加されます。ただし、ネットの管理者はこのテーブルに登録されていません。彼は、perm=3のnets_permissionテーブルにのみ存在します。

TornadoWebサーバーのハンドラーで現在のユーザーの権限を選択するクエリを作成する必要があります。コードは次の形式です。

# 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です。

現在のユーザーは、ネットの管理者(つまり、perm = 3のnets_permissionsテーブルにのみ存在する)または特定のデバイスに対する何らかの権限を持つユーザー(つまり、permの値を持つdevices_permissionsテーブルにのみ存在する)になります。

クエリ結果'userperm'では、整数を使用して、htmlページの後でパーミッション値と比較し、ユーザーに何かを表示するかどうかを指定します。

私の英語は申し訳ありませんが、問題を説明するのは難しいです。クエリを構造化して、必要な結果を取得できるかどうかわかりません。

ご助力ありがとうございます。

4

2 に答える 2

1

ユーザーは一方または両方のテーブルにいることができるため、結合の代わりに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'

上記の形式を使用すると、柔軟性が高まります。外側の選択をさらに変更して、ユーザーごとに1行のみ、各ユーザーの最高のパーマ、または各ユーザーのパーマの総数などを設定できます。

于 2012-10-12T14:27:58.120 に答える
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 に答える