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

use*_*329 3 t-sql sql-server sql-server-2008

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

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
Run Code Online (Sandbox Code Playgroud)

Aar*_*and 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 
Run Code Online (Sandbox Code Playgroud)

  • @ user1387329 - 我不认为*那是*Aaron的意图<g>.不要让它告诉你,你会*及时变得更好. (2认同)