通过存储过程存储在表中的空值

时间:2014-11-18 05:59:49

标签: sql-server stored-procedures

以下是我的存储过程,它将数据存储在两个表中,即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

任何人都可以帮我纠正这个问题。如何检查用户名条件?

由于

3 个答案:

答案 0 :(得分:1)

您的代码为

SELECT @PasswordOld = Password,@Type=ClientType,@IP=IPAddress
    FROM   Clients
    WHERE  Username = @userid

这是否意味着不会为不存在的Username返回任何行?因此,ClientTypeIPAddress的值不会被填充,并且将保留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。为了否定这一点,您可以决定在声明中使用静态值来使用ClientTypeIPAddress的默认值,但是存储它只是过时的数据,我认为会改变FailedLogins的结构不存储这似乎更符合逻辑。