首先匹配密码的存储过程然后更改它

时间:2012-05-22 19:12:37

标签: sql-server sql-server-2008 tsql

我在编写存储过程时遇到问题,该存储过程首先根据用户提供的密码检查散列密码(也是哈希)。如果密码与过程匹配,则会将密码更改为用户在存储之前进行哈希处理所提供的新密码。我对它进行了一次尝试,然后看到下面的代码,似乎完全没有正确的语法。任何可以提供的帮助将非常感激。有问题的代码如下:

Create Proc UserChangePassword
    @pGuid varchar(50),
    @pOldPassword varchar(100),
    @pHashedPassword varchar (100),
    @pNewPassword varchar(10)
AS
        set @pHashedPassword = HASHBYTES('md5', @pOldPassword)
        set @pOldPassword as select st01Password from st01UserData where @pGuid = st01GUID
        If  ( @pOldPassword = @pHashedPassword)
    Begin
        Update st01UserData (
        set st01Password = HASHBYTES('md5', @pNewPassword))
        where st01GUID = @pGuid
        Return 'SUCCESS'
    Else
        RETURN 'FAILED'
GO

1 个答案:

答案 0 :(得分:6)

您的问题背后的一些原因:

  • 为什么您的应用提供@pHashedPassword,如果您只是盲目地将其设置为您的程序的第一行?
  • 语法set @variable AS SELECT ...不是有效的T-SQL语法。
  • 您的BEGIN没有匹配的END
  • 语法UPDATE table (也无效。
  • 我认为没有理由将旧密码拉入变量,在查询之外进行比较,然后执行更新,当您可以一步完成所有这些操作时。
  • 您不能RETURN字符串,只能INT
  • 还好奇老密码可以是100个字符,但新密码只有10个?

试试这个版本:

CREATE PROCEDURE dbo.UserChangePassword
  @pGuid        VARCHAR(50),
  @pOldPassword VARCHAR(100),
  @pNewPassword VARCHAR(10)
AS
BEGIN
  SET NOCOUNT ON;

  UPDATE dbo.st01UserData
    SET st01Password = HASHBYTES('md5', @pNewPassword)
    WHERE st01Guid = @pGuid
    AND st01Password = HASHBYTES('md5', @pOldPassword);

  IF @@ROWCOUNT = 0
    RETURN -1;

  RETURN 0;
END
GO