2013-08-12 5 views
0

У меня есть следующая ситуация, и я не уверен, как лучше всего ее решить. Было бы с благодарностью принято любое руководство по подготовке необходимого представления.SQL View union from joiner table

У меня есть 4 таблицы:
пользователей (идентификатор Int, имя пользователя VARCHAR)
роли (Идентификатор роли INT, RoleName VARCHAR)
businessunit (Buid Int, buname VARCHAR)
user_role_map (идентификатор пользователя, Идентификатор роли, Buid)

В таблице ролей у меня есть роль с идентификатором 0, который является ролью «системный администратор», а в таблице businessunit у меня есть бизнес-единица ИТ. Любые пользователи, возникшие в результате запроса ниже, будут считаться системными администраторами и должны иметь полный доступ к каждой бизнес-единице.

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

Мне нужно построить представление, которое показывает все «админ несистемных» union'd к списку каждого бизнес-подразделение и каждому «системный администратор» пользователь. Первая часть проста в следующем запросе, но вторая часть - это то, с чем я борюсь.

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" 

businessunit --------------- 0, "ИТ" 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 

Примечание: пример данных здесь есть только один «System Admin» пользователь, но может быть любое количество пользователей этого типа.

ответ

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 
0

Вы можете добавить бизнес-единицы с UNION ALL к вашему виду.

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

UNION ALL 

/* append full control for system admins to all bussiness units */ 

SELECT 
    CAST(1 AS INT) AS userid, 
    CAST(1 as INT) AS roleid, 
    BU.buid 
FROM businessunit BU 
+0

Hi souplex, спасибо за предложение, но это работает только для явного примера я при условии, где есть только один пользователь с «Системным администратором Мне нужна эта работа для неограниченного количества пользователей «Системного администратора». – Aossey

+0

Я думаю, вы можете сделать это хранимой процедурой, присоединиться к таблице users и параметризовать идентификатор роли. – souplex