2010-10-12 118 views
0

我正在做一個sql查詢,我想返回一個列表,將包含將有權訪問應用程序的用戶/組。這是該方案,我們將看到用戶是否有權限,如果沒有,我們將看到該組。如果兩者都不是,我們看看是否對應用程序有任何權限,如果沒有,則將用戶添加到權限,如果用戶或組具有我們添加的權限。幫助與sql查詢

SELECT 
    dbo.APPLICATIONS_PERMISSION.USERMASTERID, 
    dbo.APPLICATIONS_PERMISSION.GROUPID, 
    dbo.APPLICATIONS_PERMISSION.VISIBLE, 
    dbo.APPLICATIONS_PERMISSION.APPLICATIONID 
FROM dbo.GROUP 
RIGHT OUTER JOIN 
dbo.APPLICATIONS_PERMISSION ON 
dbo.GROUP.ID = dbo.APPLICATIONS_PERMISSION.GROUPID 
FULL OUTER JOIN 
dbo.USER_MASTER ON 
dbo.APPLICATIONS_PERMISSION.USERMASTERID = dbo.USER_MASTER.ID 
AND dbo.GROUP.ID = dbo.USER_MASTER.GROUPID 
WHERE (dbo.APPLICATIONS_PERMISSION.USERMASTERID = 7) 
AND (dbo.APPLICATIONS_PERMISSION.APPLICATIONID = 3) 

CNC中 表模式

User_Master 
    ID 
    Name 
    GroupID 

Aplications_Permissions 
    ID 
    AplicationsID 
    UsermasterID 
    GroupID 

GROUP 
    ID 
    Name 


--Data Exemple -- 
User_Master 
1 ; Filipe ; 1 
2 ; Luis ; 1 
3 ; Daniel ; 2 
4 ; Toino ; 3 

Aplications_Permissions 
1 ; 1 ; 2 ; null 
2 ; 1 ; null ; 1 

Group 
1 abc 
2 def 
3 poi 


Result: 
input: dbo.APPLICATIONS_PERMISSION.USERMASTERID = 2 // dbo.APPLICATIONS_PERMISSION.APPLICATIONID = 1 

will return 
True 
----------------------------------------- 
input: dbo.APPLICATIONS_PERMISSION.USERMASTERID = 3 // dbo.APPLICATIONS_PERMISSION.APPLICATIONID = 1 

will return 
True 
----------------------------------------- 
input: dbo.APPLICATIONS_PERMISSION.USERMASTERID = 3 // dbo.APPLICATIONS_PERMISSION.APPLICATIONID = 2 

will return 
True (because nobody have permissions in that application) 
----------------------------------------- 
input: dbo.APPLICATIONS_PERMISSION.USERMASTERID = 3 // dbo.APPLICATIONS_PERMISSION.APPLICATIONID = 2 

will return 
False(dont have permissions, and dont belong to that group) 
+0

這個我現在有,但不工作:S只對用戶和該組中的用戶工作 – Luis 2010-10-12 16:06:24

+0

它可能有助於查看您的表模式?另外,您是否需要在一個查詢中執行此操作? (即使你這樣做了,也許可以幫助你解決這個問題,你可以通過幾個更小的查詢來了解你的工作,然後建立這些部分。) – pjmorse 2010-10-12 16:07:41

+1

你不能發表表格的細節,結構和可能的預期從查詢輸出? – Kangkan 2010-10-12 16:08:15

回答

0

接過走樣表的可讀性的自由:

SELECT ap.USERMASTERID, ap.GROUPID, ap.VISIBLE, ap.APPLICATIONID 
FROM dbo.GROUP g 
RIGHT OUTER JOIN dbo.APPLICATIONS_PERMISSION ap ON g.ID = ap.GROUPID 
FULL OUTER JOIN dbo.USER_MASTER um 
    ON ap.USERMASTERID = um.ID AND g.ID = um.GROUPID 
WHERE (um.ID = 7) AND (ap.APPLICATIONID = 3) 

如果我理解正確的話,聽起來好像我們要返回一個列表誰擁有應用程序的直接權限的用戶,或誰是具有應用程序權限的組的成員。

讓我們單獨做這兩個查詢簡化它:

--Direct permission 
SELECT ap.USERMASTERID, NULL AS 'GROUPID', ap.VISIBLE, ap.APPLICATIONID 
FROM dbo.APPLICATIONS_PERMISSION ap 
INNER JOIN dbo.USER_MASTER um ON ap.USERMASTERID = um.ID 
WHERE (ap.USERMASTERID = 7) AND (ap.APPLICATIONID = 3) 

UNION ALL 

--Permission through group membership 
SELECT ap.USERMASTERID, ap.GROUPID, ap.VISIBLE, ap.APPLICATIONID 
FROM dbo.APPLICATIONS_PERMISSION ap 
INNER JOIN dbo.Group g ON ON g.ID = ap.GROUPID 
INNER JOIN dbo.USER_MASTER um ON g.USERMASTERID = um.ID 
WHERE (um.ID = 7) AND (ap.APPLICATIONID = 3) 

可能與這一點發揮得正是你需要的,但我要說:單獨做他們。可能甚至不需要連接到User_Master表,因爲它看起來並不像你實際從中檢索任何字段。只需從ap.UserMasterID或g.UserMasterID進行過濾。

+0

嗨,只是添加表架構,並可能結果 – Luis 2010-10-12 16:26:19