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.
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?
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
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();
}
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?
263 ms totalt · 4 externa anrop · v20260731065814-full.51f67c91