BjurisMedlem sedan juli 2001514 inlägg Jag har en sp enl. följande:
CREATE PROCEDURE sp_Roles
@SystemID char (10),
@UserId char (10)
AS
SELECT G.[Name]
FROM Roles R
Inner JOIN Groups G ON
R.GroupID = G.GroupID
Inner JOIN Users U ON
R.UserID = @UserID AND R.SystemID = @SystemID
GO
Den hämtar data från en tabell, men som beror på två andra.
Problemet är att jag får tillbaka samma värde lika många gånder som antalet rader som finns i users.
I Roles så lagrar jag SystemID | UserID | GroupID
i Groups finns GroupID | Name
i users: SystemID | UserID | Password
Om det finns 12 användare så får jag tillbaka [NAME] 12 gånger, men i själva verket så finns det bara en rad som skall stämma överens.
Vad har jag gjort för fel?
LarsGMedlem sedan dec. 200012 464 inlägg Du ställer inga villkor på users och du hämtar heller inget från den så jag förstår inte varför den är med i frågan överhuvudtaget.
BjurisMedlem sedan juli 2001514 inlägg Då sitter jag fast...
Hur skall jag skriva för att hämta ut alla roller som användaren är tilldelad?
LarsGMedlem sedan dec. 200012 464 inlägg SELECT G.[Name]
from groups g
where groupid in
(select groupid
FROM Roles R
where R.UserID = @UserID
AND R.SystemID = @SystemID)
BjurisMedlem sedan juli 2001514 inlägg Det blir fortfarande så att jag får 12 records från frågan och det beror på att det finns 12 users...
Varje user är ju representerad i Roles, som i sin tur refererar till Groups..
LarsGMedlem sedan dec. 200012 464 inlägg Jag får inte ihop detta. Det har ingen betydelse hur många förekomster av ett groupid det finns i roles när man använder en subselect. kan du exemplifiera med datainnehåll och resultat och den exakta fråga du använder?
BjurisMedlem sedan juli 2001514 inlägg Jag använder din fråga ovan.
när jag kör sp_Roles så hämtar den ut alla roller som skall finnas på den användaren och separerar dem med |
ex1:
svaret jag får:
customerDBSales|customerDBSales|customerDBSales|customerDBSales|customerDBSales|
customerDBSales|customerDBSales|customerDBSales|customerDBSales|customerDBSales|customerDBSales|customerDBSales
UserID = ALHA
SystemID = TDV
i tabellen user så finns ALHA & TDV en gång
i tabellen Roles finns ALHA & TDV en gång som refererar till GroupID = 3
i tabellen Groups så finns GroupID = 3 en gång och den pekar på customerDBSales
ex2:
customerDBAdmin|customerDBAdmin|customerDBAdmin|customerDBAdmin|customerDBAdmin|customerDBAdmin|
customerDBAdmin|customerDBAdmin|customerDBAdmin|customerDBAdmin|customerDBAdmin|customerDBAdmin
UserID = DBUSER
SystemID = TDV
i tabellen user så finns DBUSER& TDV en gång
i tabellen Roles finns DBUSER& TDV två gång som refererar till GroupID = 2 & GroupID = 1
i tabellen Groups så finns GroupID = 1 en gång och den pekar på customerDBAdmin & GroupID = 2 en gång och den pekar på customerDBUser
När jag hämtar rollerna använder jag följande:
private String AssignRoles(string SystemId,String UserId)
{
//Return a | separated list of roles this user is a member of
int i;
string strRoles="";
ArrayList aList = new ArrayList();
dg.ExecuteQuery("sp_GetRoles '" + SystemId + "', '" + UserId + "'", ref aList);
for(i=0;i<aList.Count;i++)
{
ArrayList al= (ArrayList) aList[i]; // al is one row with index for each columns
if(i>0)
strRoles += "|";
strRoles += ((string)al[0]).Trim();
}
return strRoles.Trim();
}
Peter SMedlem sedan dec. 20025 483 inlägg För att citera mig själv från en granntråd:
Peter S skrev:
Vad Lars menar med "datainnehåll" och "förväntat resultat", är att du skall posta exempelinnehåll från tabellen:
id | name | address
-------------------
1 | foo | bar
-------------------
2 | ... | u.s.w.
-------------------
Samt hur du förväntar dig att resultatet skall bli:
id | name
---------
1 | foo
---------
7 | faa
---------
9 | ...
---------
aasahMedlem sedan mars 20034 471 inlägg
Bjuris skrev:
...
CREATE PROCEDURE sp_Roles
@SystemID char (10),
@UserId char (10)
AS
SELECT G.[Name]
FROM Roles R
Inner JOIN Groups G ON
R.GroupID = G.GroupID
Inner JOIN Users U ON
R.UserID = @UserID AND R.SystemID = @SystemID
GO
I Roles så lagrar jag SystemID | UserID | GroupID
i Groups finns GroupID | Name
i users: SystemID | UserID | Password
Nu vet jag inte hur det fungerar att definiera procedurer, så det här kan vara helt uppåt väggarna galet... Men, jag tycker inte det ser ut som om du gör någon koppling till U. Borde du inte behöva skriva (i stil med):
...
CREATE PROCEDURE sp_Roles
@SystemID char (10),
@UserId char (10)
AS
SELECT G.[Name]
FROM Roles R
Inner JOIN Groups G ON
R.GroupID = G.GroupID
Inner JOIN Users U ON
R.UserID = U.UserID AND R.SystemID = U.SystemID AND
R.UserID = @UserID AND R.SystemID = @SystemID
GO
Hur vet den annars att U-värdena ska stämma med R-värdena? :q