2010-10-12 6 views
0

Je fais une requête sql où je veux retourner une liste qui contiendra les utilisateurs/groupes qui auront accès à une application. C'est le schéma, nous verrons si un utilisateur a des permissions, sinon, nous allons voir le groupe. Si les deux ne le sont pas, nous voyons s'il y a des permissions sur l'application, sinon, ajouterons l'utilisateur aux permissions, si l'utilisateur ou le groupe a des permissions que nous ajoutons.Aide avec la requête 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) 

-Edit- Tableau schéma

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

ce que j'ai en ce moment, mais ne fonctionne pas: S ne fonctionne que pour l'utilisateur, et les utilisateurs de ce groupe – Luis

+0

Il peut être utile de voir vos schémas de table? Aussi, avez-vous besoin de le faire dans une requête? (Même si vous le faites, il peut être utile de décomposer plusieurs petites requêtes que vous * savez * travailler, puis de les assembler.) – pjmorse

+1

Vous ne pouvez pas afficher les détails de la (des) table (s), leur structure et probablement le sortie de la requête? – Kangkan

Répondre

0

A pris la liberté de l'aliasing des tables pour une meilleure lisibilité:

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) 

Si je comprends bien, on dirait que nous voulons retourner une liste des utilisateurs qui ont une autorisation directe sur l'application ou qui sont membres d'un groupe avec l'autorisation de l'application.

Simplifions en procédant ces deux requêtes séparément:

--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) 

aurait peut-être jouer avec cela un peu pour obtenir exactement ce dont vous avez besoin, mais je dirais: faire séparément. Peut-être même pas besoin de la jointure à la table User_Master, car il ne semble pas que vous y récupériez des champs. Filtrez simplement depuis ap.UserMasterID ou g.UserMasterID.

+0

salut, vient d'ajouter le schéma de la table, et probablement des résultats – Luis