0

次のような状況があり、どのように対処すればよいかわかりません。必要なビューを準備する方法についてのガイダンスをいただければ幸いです。

4 つのテーブルがあります:
ユーザー (userid int、username varchar)
ロール (roleid int、rolename varchar)
businessunit (buid int、buname varchar)
user_role_map (userid、roleid、buid)

ロール テーブルには、「システム管理者」ロールである ID が 0 のロールがあり、ビジネス ユニット テーブルには IT ビジネス ユニットがあります。以下のクエリの結果として得られるユーザーは、システム管理者と見なされ、すべてのビジネス ユニットへのフル アクセス権を持つ必要があります。

SELECT userid FROM user_role_map WHERE roleid = 0 AND buid = 0

すべての「非システム管理者」をすべてのビジネス ユニットとすべての「システム管理者」ユーザーのリストに結合して表示するビューを作成する必要があります。最初の部分は以下のクエリで簡単ですが、2 番目の部分は私が苦労しているものです。

SELECT userid, roleid, buid FROM user_role_map WHERE roleid > 0 AND buid > 0

私が達成しようとしていることを説明するのに役立つサンプルデータをいくつか示します。

users
---------------
1, "sysAdmin"  
2, "salesUser1"  
3, "serviceUser1"  
4, "manager1"  
5, "salesUser2"
6, "serviceUser2"
7, "manager2"
roles
---------------
0, "SystemAdmin"
1, "Full"
2, "Update"
3, "Read"

ビジネスユニット --------------- 0、「IT」1、「fooSales」2、「fooService」3、「barSales」4、「barService」

user_role_map
---------------
1, 0, 0
2, 1, 1
2, 3, 3
3, 1, 2
3, 3, 4
4, 1, 1
4, 1, 2
5, 1, 3
5, 3, 1
6, 1, 4
6, 3, 3
7, 1, 2
7, 1, 4

最後に、上記のサンプル データに対して以下を提供するビューが必要です (最後の 4 行に注意してください)。

new view
---------------
2, 1, 1
2, 3, 3
3, 1, 2
3, 3, 4
4, 1, 1
4, 1, 2
5, 1, 3
5, 3, 1
6, 1, 4
6, 3, 3
7, 1, 2
7, 1, 4
1, 1, 1
1, 1, 2
1, 1, 3
1, 1, 4

注: この例のデータには「システム管理者」ユーザーが 1 人しかいませんが、このタイプのユーザーは何人でも存在する可能性があります。

4

2 に答える 2

0

次のようなことができるはずです。

declare @users table(userid int, username varchar(255));
insert into @users values (1, 'sysAdmin');
insert into @users values (2, 'salesUser1');  
insert into @users values (3, 'serviceUser1');  
insert into @users values (4, 'manager1');  
insert into @users values (5, 'salesUser2');
insert into @users values (6, 'serviceUser2');
insert into @users values (7, 'manager2');


declare @roles table(roleid int, rolename varchar(255));
INSERT INTO @roles VALUES (0, 'SystemAdmin');
INSERT INTO @roles VALUES (1, 'Full');
INSERT INTO @roles VALUES (2, 'Update');
INSERT INTO @roles VALUES (3, 'Read');

DECLARE @user_role_map TABLE(userid INT, roleid INT, buid int)
INSERT INTO @user_role_map values (1, 0, 0);
INSERT INTO @user_role_map values (2, 1, 1);
INSERT INTO @user_role_map values (2, 3, 3);
INSERT INTO @user_role_map values (3, 1, 2);
INSERT INTO @user_role_map values (3, 3, 4);
INSERT INTO @user_role_map values (4, 1, 1);
INSERT INTO @user_role_map values (4, 1, 2);
INSERT INTO @user_role_map values (5, 1, 3);
INSERT INTO @user_role_map values (5, 3, 1);
INSERT INTO @user_role_map values (6, 1, 4);
INSERT INTO @user_role_map values (6, 3, 3);
INSERT INTO @user_role_map values (7, 1, 2);
INSERT INTO @user_role_map values (7, 1, 4);

DECLARE @businessunit TABLE(buid int, buidname VARCHAR(255));
INSERT INTO @businessunit VALUES (0, 'IT')
INSERT INTO @businessunit VALUES (1, 'fooSales')
INSERT INTO @businessunit VALUES (2, 'fooService')
INSERT INTO @businessunit VALUES (3, 'barSales')
INSERT INTO @businessunit VALUES (4, 'barService')

--non-admin users
SELECT userid, roleid, buid 
FROM @user_role_map 
WHERE 
    roleid > 0 AND buid > 0

UNION ALL

--get admin users and add a full control entry
SELECT userid, 1, BusinessUnits.buid 
FROM @user_role_map m
CROSS JOIN(
    --use this if you have a businessunit table you can leverage; otherwise, 
    --you can select distinct buid on role_map where  buid > 0
    SELECT buid
    FROM @businessunit
    WHERE buid > 0
) AS BusinessUnits
WHERE 
    roleid = 0 AND m.buid = 0
于 2013-08-12T05:43:37.490 に答える