Sql server 如何从SQLServer中的存储过程中获取作为整数的输出响应
我试图从存储过程中获取以下响应,以验证用户身份,并根据用户输入从存储过程中读取响应Sql server 如何从SQLServer中的存储过程中获取作为整数的输出响应,sql-server,tsql,Sql Server,Tsql,我试图从存储过程中获取以下响应,以验证用户身份,并根据用户输入从存储过程中读取响应 CREATE Procedure sp_UserAuthentication @UserName varchar(20), @UserPassword varchar(20), @Resp int output AS DECLARE @Count int; DECLARE @IsAdmin bit; DECLARE @IsActive bit; Select @Count = COUNT(UserName) fr
CREATE Procedure sp_UserAuthentication
@UserName varchar(20),
@UserPassword varchar(20),
@Resp int output
AS
DECLARE @Count int;
DECLARE @IsAdmin bit;
DECLARE @IsActive bit;
Select @Count = COUNT(UserName) from tbl_UserDetails where UserName = @UserName and UserPassword = @UserPassword
IF @Count = 1
BEGIN
Select @IsActive = IsActive, @IsAdmin = @IsAdmin from tbl_UserDetails where UserName = @UserName and UserPassword = @UserPassword
IF @IsActive = 0 -- InActive user
BEGIN
SET @Resp = 3
END
ELSE IF @IsAdmin = 1 -- Admin user
BEGIN
SET @Resp = 2
END
ELSE -- Normal user
BEGIN
SET @Resp = 1
END
END
ELSE -- InValid user
BEGIN
SET @Resp = 0
END
GO
我得到的响应总是1表示有效用户,0表示无效用户。我没有得到管理员2和非活动用户3的响应
DECLARE @Res int
exec sp_UserAuthentication 'user', 'pwd', @Res out
SELECT @Res
表:
Create Table tbl_UserDetails(
UserName Varchar(20) primary key,
UserPassword Varchar(20) NOT NULL,
IsAdmin Bit Default 0,
IsActive Bit Default 1
);
让我们忽略将用户名和密码放入表中的事实。请不要这样做,如果这样做,请使用某种加密/哈希。但请看中间的SELECT语句:
Select @IsAdmin = @IsAdmin
您正在将@IsAdmin设置为@IsAdmin,您需要将其设置为刚才的IsAdmin 记住每个人对存储明文密码的严厉谴责。您迫切需要阅读并了解如何加密这些文件。但是你的整个过程可以大大简化成这样
CREATE Procedure UserAuthentication
(
@UserName varchar(20),
@UserPassword varchar(20),
@Resp int output
)
AS
set @Resp = 0 --This sets the response to invalid unless we actually find a user
Select @Resp =
case when IsActive = 0 then 3 --Inactive User
when IsAdmin = 1 then 2 --Admin user
else 1 --Normal user
end
from tbl_UserDetails
where UserName = @UserName
and UserPassword = @UserPassword
这不是你问题的答案,但你有几个问题。首先是sp_uu前缀。这是一个糟糕的命名约定。你最好使用一个不同的,甚至更好的,没有前缀。另一个问题更为严重。您正在以明文形式存储密码。密码应该总是被加盐和散列。至于你的实际问题,我们不能在这里提供太多帮助,因为我们没有数据来处理。您是否有非活动用户?我认为您可以在select语句中使用case表达式,并避免所有复杂的If/Else逻辑来检查变量。向我们展示一些示例数据,它似乎对我有用,而不是使用框架的内置机制构建您自己的身份验证。你发布的内容存储了清晰的密码,这在当今是不可接受的。在过去的一年里,你不可能错过几十次违规行为!您需要存储和比较咸哈希。加密强散列需要数千次迭代。ASP.NET已经包含一个强大的身份验证机制,桌面应用程序也可以使用该机制。使用它谢谢各位,我会确保使用salt和hash形式的密码OP还可以在客户端返回行和检查字段,并使用连接而不是两个单独的查询。