Sql 用于登录的存储过程未按预期工作
我有3个表,用户、角色和用户角色Sql 用于登录的存储过程未按预期工作,sql,sql-server,Sql,Sql Server,我有3个表,用户、角色和用户角色 CREATE TABLE [Web].[Users] ( [Employee_ID] [Nvarchar] (10) NOT NULL PRIMARY KEY, [Username] [nvarchar] (25) NOT NULL, ) GO CREATE TABLE [Web].[Roles] ( [Role_ID] [Int] NOT NULL IDENTITY PRIMARY KEY, [Roles] [nvarcha
CREATE TABLE [Web].[Users]
(
[Employee_ID] [Nvarchar] (10) NOT NULL PRIMARY KEY,
[Username] [nvarchar] (25) NOT NULL,
)
GO
CREATE TABLE [Web].[Roles]
(
[Role_ID] [Int] NOT NULL IDENTITY PRIMARY KEY,
[Roles] [nvarchar] (25) NOT NULL,
)
GO
CREATE TABLE [Web].[User_Roles]
(
[Employee_ID] [Nvarchar](10) NOT NULL,
[Role_ID] [int] NOT NULL,
CONSTRAINT FK_Employee_ID
FOREIGN KEY (Employee_ID) REFERENCES [Web].[Users] (Employee_ID)
ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT FK_Role_ID
FOREIGN KEY (Role_ID) REFERENCES [Web].[Roles] (Role_ID),
CONSTRAINT pk_User_Roles PRIMARY KEY (Employee_ID, Role_ID)
);
它的工作方式是,当您登录时,它根据Users
表中的Employee\u ID
检查您的用户名,然后转到User\u Roles
表,并将从Users
表中获得的Employee\u ID
与User\u Roles
表相匹配。然后它从User\u Roles
表中获取Role\u ID
,并将Role\u ID
与Roles
表中的角色相匹配
我正在尝试编写一个执行检查的存储过程,到目前为止我已经接近完成,但我觉得我遗漏了一些东西。希望我能得到帮助。这就是我目前所拥有的
CREATE PROCEDURE [Web].[Get_User_Roles]
@Username NVARCHAR(25)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @Employee_ID Nvarchar, @Role_ID INT
SELECT @Employee_ID = @Employee_ID, @Role_ID = @Role_ID
FROM [Web].[Users]
WHERE @Employee_ID = @Employee_ID AND @Role_ID = @Role_ID
IF @Employee_ID IS NOT NULL
BEGIN
IF NOT EXISTS (SELECT @Employee_ID FROM [Web].Users
WHERE @Username = Username)
BEGIN
SELECT
@Employee_ID [Employee_ID],
(SELECT @Role_ID FROM User_Roles
WHERE @Role_ID = @Role_ID) [Roles]-- User Valid
END
ELSE
BEGIN
SELECT -2 [@Username], '' [Roles]--User not activated
END
END
ELSE
BEGIN
SELECT -1 [@Username], '' [Roles]-- User invalid
END
END
如有任何改进,我们将不胜感激。我把表格代码放在上面,这样就可以使用了。我将在本节以及中间部分再次询问我的最终结果。它的工作方式是,当您登录时,它将根据用户表中的员工ID检查您的用户名,然后转到用户角色表,并将从用户表中获得的员工ID与用户角色表中的员工ID进行匹配。然后,它从User_Roles表中获取Role_ID,并将Role_ID与Roles表中的角色相匹配。我正在尝试创建一个执行检查的存储过程,到目前为止,我已经很接近了,但我觉得我遗漏了一些东西。希望我能得到帮助。这就是我目前所拥有的 首先,这部分根本不起作用:
CREATE PROCEDURE [Web].[Get_User_Roles]
@Username NVARCHAR(25)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @Employee_ID Nvarchar, @Role_ID INT
SELECT @Employee_ID = @Employee_ID, @Role_ID = @Role_ID
FROM [Web].[Users]
WHERE @Employee_ID = @Employee_ID AND @Role_ID = @Role_ID
IF @Employee_ID IS NOT NULL
BEGIN
IF NOT EXISTS (SELECT @Employee_ID FROM [Web].Users
WHERE @Username = Username)
BEGIN
SELECT
@Employee_ID [Employee_ID],
(SELECT @Role_ID FROM User_Roles
WHERE @Role_ID = @Role_ID) [Roles]-- User Valid
END
ELSE
BEGIN
SELECT -2 [@Username], '' [Roles]--User not activated
END
END
ELSE
BEGIN
SELECT -1 [@Username], '' [Roles]-- User invalid
END
END
select @Employee_ID = @Employee_ID, @Role_ID = @Role_ID
from [Web].[Users] WHERE @Employee_ID = @Employee_ID and @Role_ID = @Role_ID
您在WHERE语句中将变量与其自身进行比较,将变量相互分配,并且在[Web].[Users]表中没有角色ID。试试下面的方法
SELECT Employee_ID, Roles
FROM [Web].[Users] A
INNER JOIN [Web].[User_Roles] B
ON A.[Employee_ID] = B.[Employee_ID]
INNER JOIN [Web].[Roles] C
ON b.[Role_ID] = C.[Role_ID]
WHERE [Username] = @Username
如果用户使用该用户名,此代码将返回员工id和角色,否则返回空数据集。仍然不太清楚要输出什么,但我认为应该是这样的。如果用户没有角色,则在UserStatus列中返回-2。否则,它将在该列和角色中返回1。调用此函数时,应该检查是否返回了行。如果它不返回任何行,则用户不存在
select UserStatus = case when ur.Role_ID is null then -2 else 1 end
, r.Roles
from Web.Users u
left join Web.User_Roles ur on ur.Employee_ID = u.Employee_ID
left join Web.Roles r on r.Role_ID = ur.Role_ID
where u.Username = @Username
选择@Employee\u ID=@Employee\u ID、@Role\u ID=@Role\u ID
?这句话的目的是什么?它只是将@Employee\u ID
的值设置为@Employee\u ID
的值;这是毫无意义的,因为它是@Employee\u ID
。我被告知需要设置它,以便在存储过程中将这两个值放在一起。返回选择@Employee\u ID=@Employee\u ID,@Role\u ID=@Role\u ID=@Role\u ID from[Web].[用户]其中@Employee\u ID=@Employee\u ID=@Employee\u ID和@Role\u ID=@Role\u ID
实际上毫无意义。这是为了达到什么目的?不,你没有被错误地告知,你的编码是错误的。您正在检查变量的值是否等于无意义变量的值。您应该检查变量的值是否等于表中某列的值。您在发布的代码中有许多挑战。每次引用变量时,它都不是您想要做的。你有一个没有大小的varchar。这件事需要彻底重建。@SeanLange我想很明显我的编码不正确,所以我请求帮助修复它。我只是按照你的建议做了一些改变。我马上就要编辑了。也许可以使用左连接,这样就可以清楚地知道缺少了什么?@Hogan我想你只想抓取那些实际附加了一些角色的用户。但是,如果用户没有角色是可以接受的,我们可以使用左连接。@Alex是正确的。我们只需要具有角色的用户。如果没有角色,则不接受登录。这就是我提取原始代码的地方。这可能对你有帮助。我的输出取决于用户输入的有效用户名。然后检查用户名和员工ID,然后检查员工ID和角色ID,然后检查角色ID和角色。在所有这些检查之后,它会弹出带有角色的有效用户名或无效用户或没有角色的有效用户。sql的第一行对我来说就足够了。他们接收明文密码并将其以明文形式存储在表中。这一逻辑有着可悲的缺陷。如果用户有多个角色,则该示例中的代码将只返回一个角色。你可以找到更好的例子来说明如何做这类事情。