以下是我的存储过程,它将数据存储在两个表中,即SuccessfulLogins和FailedLogins
ALTER procedure [dbo].[Proc_CheckUser]
@UserID VARCHAR(50),
@Password VARCHAR(50)
AS
SET NOCOUNT ON
DECLARE @ReturnVal VARCHAR(500)
DECLARE @PasswordOld VARCHAR(50)
DECLARE @Type NVARCHAR(50)
DECLARE @IP NVARCHAR(50)
SELECT @PasswordOld = Password,@Type=ClientType,@IP=IPAddress
FROM Clients
WHERE Username = @userid
IF (@PasswordOld IS NULL)
BEGIN
SET @ReturnVal='1|Incorrect Username'
INSERT INTO FailedLogins(Username,Password,ClientType,Reason,IPAddress)
VALUES(@UserID,Hashbytes('SHA1',@Password),@Type,'Invalid Username',@IP)
END
ELSE
BEGIN
IF (@PasswordOld!=Hashbytes('SHA1',@Password))
BEGIN
SET @ReturnVal='1|Incorrect Password'
INSERT INTO FailedLogins(Username,Password,ClientType,Reason,IPAddress)
VALUES(@UserID,Hashbytes('SHA1',@Password),@Type,'Invalid Password',@IP)
END
ELSE
BEGIN
SET @ReturnVal='0|Logged in Successfully' +'|'+ rtrim(cast(@Type as char))
INSERT INTO SuccessfulLogins(Username,Password,ClientType,Reason,IPAddress)
VALUES(@UserID,Hashbytes('SHA1',@Password),@Type,'Valid Login Credentials Provided',@IP)
END
END
SELECT @ReturnVal
这里的问题是每当我输入一个无效的用户名时,存储过程会返回正确的消息,即不正确的用户名,但它会在失败的登录表中的ClientType和IPAddress字段中存储NULL值
以下是我对无效用户名的插入查询
IF (@PasswordOld!=Hashbytes('SHA1',@Password))
BEGIN
SET @ReturnVal='1|Incorrect Password'
INSERT INTO FailedLogins(Username,Password,ClientType,Reason,IPAddress)
VALUES(@UserID,Hashbytes('SHA1',@Password),@Type,'Invalid Password',@IP)
END
任何人都可以帮我纠正这个问题。如何检查用户名条件?
由于
答案 0 :(得分:1)
您的代码为
SELECT @PasswordOld = Password,@Type=ClientType,@IP=IPAddress
FROM Clients
WHERE Username = @userid
这是否意味着不会为不存在的Username
返回任何行?因此,ClientType
和IPAddress
的值不会被填充,并且将保留NULL
,这将是预期的功能。
但是,如果要存储某些值,或者这些字段不可为空,请为这些参数指定静态值。
答案 1 :(得分:1)
您的查询是正确的。当Username = @UserId不匹配时,@ Type,@ IP变量将为null。由于表中没有该UserName的记录。您可以做的是在声明中您可以启动某个默认值,以便将其插入到FailedLogins表中。
DECLARE @Type NVARCHAR(50)="DefaultType/NoType"
DECLARE @IP NVARCHAR(50)="0.0.0.1"
如上所述。
答案 2 :(得分:1)
如果用户名无效,则表单Clients
中不会显示,因此从该表中提取的字段也将为NULL
。为了否定这一点,您可以决定在声明中使用静态值来使用ClientType
和IPAddress
的默认值,但是存储它只是过时的数据,我认为会改变FailedLogins
的结构不存储这似乎更符合逻辑。