3

我无法编写一个存储过程,该过程首先根据用户提供的密码(也是散列)检查散列密码。如果密码匹配,该过程会将密码更改为用户提供的新密码,以便在存储之前对其进行哈希处理。我试了一下,发现下面的代码似乎完全超出了正确的语法。任何可以提供的帮助将不胜感激。有问题的代码如下:

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
4

1 回答 1

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 
于 2012-05-22T19:28:31.137 回答