我创建了一个以username
,password
,hashvalue
为列的表格。
create table userDetails
(
username varchar(50),
password varchar (50),
hashvalue varchar (3000)
)
我希望通过执行存储过程对表中存储的每个密码进行哈希处理,并在同一存储过程中将哈希值插入表中。
我按如下方式创建了存储过程:
CREATE PROCEDURE hashpwd
@username varchar(50) = default ,
@pwd varchar(50) = default
AS
BEGIN
DECLARE @hashed varchar(4000);
SET @hashed = HASHBYTES('SHA1', @pwd); --edited to @pwd
select username,password from userDetails
WHERE username LIKE @username AND password LIKE @pwd;
END
BEGIN
insert into userDetails
(hashvalue) values (@hashed);
END
可以执行该过程,但结果是错误的。它产生NULL和随机字符串。当最初表中只有2行时,也会创建第3行。
感谢任何指导。
答案 0 :(得分:1)
Create PROCEDURE hashpwd
@username varchar(50) = default ,
@pwd varchar(50) = default
AS
BEGIN
DECLARE @hashed varchar(4000);
SET @hashed = HASHBYTES('SHA1', @pwd); --(@pwd instead of @hashed)
Update userDetails set hashvalue = @hashed
WHERE username LIKE @username AND password LIKE @pwd
END
您应该使用Update语句而不是Insert,并且语句应该出现在过程体中。
答案 1 :(得分:0)
我在提交回复时一直收到错误,但对于上面的回复,请将where子句替换为
WHERE username = @username
答案 2 :(得分:0)
看到错误结果的原因是由于hashvalue
列的数据类型。当HASHBYTES
函数返回VARBINARY
时,应将其用作数据类型。
create table userDetails
(
username varchar(50),
password varchar (50),
hashvalue varbinary(40) -- Note, this should only be 40 characters long
)
我不太确定您的存储过程打算做什么。我想对于给定的用户名和密码,您想更新相应行上的哈希值?如果是这样,我会这样做。
CREATE PROCEDURE hashpwd
@username varchar(50) = default ,
@pwd varchar(50) = default
AS
BEGIN
UPDATE userDetails
SET hashvalue = HASHBYTES('SHA1', @pwd); --edited to @pwd
WHERE username LIKE @username AND password LIKE @pwd;
END