2014-11-21 86 views
0

我有我解决不了问题的SQL的SQL Server:查询多值表递归

有2台mmsmms_mv,它们通过object_id联系。

mms_mv是多值表和内容是组成员和组管理器,它也可以是其它基团。

这将运行SQL Server上

mms

|object_id|attribute_type|objectSid| 
| 1  |user   | a  | 
| 2  | group  | b  | 
| 3  | group  | c  | 
| 4  | group  | d  | 
| 5  | group  | f 

mms_mv

|object_id|attribute_name|reference_id| 
| 2  | member  | 1   | 
| 3  | manager  | 1   | 
| 4  | manager  | 2   | 

我试图找出用户可以通过嵌套组管理直接或间接哪些群体。

在上面的例子中,用户(1)是组2的成员,组2是组4的管理者 用户1是组3的管理者。

哪些群体可以由用户来管理?

所以我需要输出为第3组和4

select 
    accountname, objectsid, mms1.reference_id as ManagerID, 
    mms2.object_id 
from 
    dbo.mms_mv_link as mms1 with (nolock) 
inner join 
    dbo.mms_metaverse as mms2 with (nolock) on mms1.object_id = mms2.object_id 
where 
    mms2.object_type ='group' 
    and mms1.attribute_name = 'manager' 
    and mms1.reference_id in (1, 3) 

这是最好的我想出了找出我提交的所有组ID和用户ID的这是一组的经理。我用了一个其他的查找来获得组的用户是。

我的问题是嵌套组,由长期的思考和谷歌上搜索,我不知道,如果它甚至可能创造这样的查询。

我可以找到所有组的用户是成员,但我还需要在这些组成员组。

嗯,我很高兴,如果有人有一些想法或提示,我推测这一个。

我,如果你有一个很好的SQL本书涵盖如此复杂的查询,建议,甚至高兴。

谢谢大家的帮助。

+1

难道mms_vm.object_id是的object_id在MMS中的一个的情况下? Ans也是那个reference_id也是mms中的object_id之一吗?只是想清楚这些关系。 – 2014-11-21 14:09:09

+0

我不认为这是数据库查询的任务。递归会导致非常复杂的情况。我建议你对你的编程语言进行这种分析。 – ericpap 2014-11-21 14:09:26

+0

您可以使用C#或其他语言编写递归函数来收集用户ID并确定用户权限 – ericpap 2014-11-21 14:10:32

回答

0

我认为下面的递归CTE会给你想要的东西:

;WITH cte AS 
(
    SELECT m2.object_id AS groupID, m2.attribute_name 
    FROM @mms AS m1 
    INNER JOIN @mms_mv AS m2 ON m1.object_id = m2.reference_id 
    INNER JOIN @mms m3 ON m2.object_id = m3.object_id 
    WHERE m1.attribute_type = 'user' AND m3.attribute_type = 'group' 

    UNION ALL 

    SELECT m.object_id AS groupID, m.attribute_name 
    FROM cte AS c 
    INNER JOIN @mms_mv AS m ON c.groupID = m.reference_id 
) 
SELECT * 
FROM cte 
WHERE attribute_name <> 'member' 

CTE的所谓“锚”的查询返回的用户都管理或为成员的所有组。使用递归,我们得到由原始集合或任何“中间”集合管理的所有其他组。

有了这些数据作为输入:

DECLARE @mms TABLE (object_id INT, attribute_type VARCHAR(10), objectSid VARCHAR(10)) 
DECLARE @mms_mv TABLE (object_id INT, attribute_name VARCHAR(10), reference_id INT) 

INSERT @mms VALUES 
(1, 'user', 'a'), 
(2, 'group', 'b'),  
(3, 'group', 'c'),  
(4, 'group', 'd'),  
(5, 'group', 'f') 

INSERT @mms_mv VALUES 
(2, 'member', 1), 
(3, 'manager', 1), 
(4, 'manager', 2), 
(5, 'manager', 3) 

上述查询产生以下输出:

groupID attribute_name 
---------------------- 
3  manager 
5  manager 
4  manager