我有一个带有以下签名的存储过程:
CREATE DEFINER=`prod`@`%` PROCEDURE `User_Create`(IN login VARCHAR(45), IN pwd VARCHAR(45), IN fname VARCHAR(45), IN lname VARCHAR(45), IN email VARCHAR(45), IN group_name VARCHAR(45))
BEGIN
INSERT INTO `Users` (`login`, `first_name`, `last_name`, `email`, `create_time`)
SELECT login, fname, lname, email, NOW();
CALL User_UpdatePassword(login, pwd);
INSERT INTO UserGroupsUsers (`group_id`, `user_id`)
SELECT ug.id, u.id
FROM UserGroups ug, Users u
WHERE ug.`name` = group_name AND u.`login` = login;
END
另一个像这样:
CREATE DEFINER=`prod`@`%` PROCEDURE `User_UpdatePassword`(IN login VARCHAR(45), IN newpassword VARCHAR(45))
BEGIN
-- Note that in mysql 5.5.32 SHA2 returns hex so we need to use unhex before calling BASE64_ENCODE
UPDATE Users u,
(
SELECT CONVERT(BASE64_ENCODE(unhex(SHA2(CONVERT(CONCAT(newpassword, `salt`) USING UTF8), 512))) USING utf8) AS `newpassword`, CONVERT(`salt` using UTF8) AS `newsalt`, length(salt) as saltlength
FROM (SELECT BASE64_ENCODE(substring(CONCAT(md5(rand()),md5(rand())), 1, 48)) AS `salt`) t1
) pwd
SET u.`password` = pwd.`newpassword`, u.`salt` = pwd.`newsalt`
WHERE u.`login` = login;
END
我似乎遇到的问题是:
SET @login = 'newlogin' $$
SET @fname = 'Ben' $$
SET @lname = 'Bobbers' $$
SET @email = 'ben@bobbers.com' $$
SET @pwd = 'P@ssword' $$
SET @grpname = 'GrpName' $$
CALL User_Create(@newuser_login, @pwd, @first_name, @last_name, @email, @grpname)
$$
正在创建用户并将其正确放入组中,但由于某种原因,User_UpdatePassword似乎没有在正确的参数中传递。我知道User_UpdatePassword可以工作,因为如果我然后调用 调用User_UpdatePassword('newlogin','P @ ssword')$$
调用User_Create后,它工作正常。不知何故,当从另一个存储过程内部调用User_UpdatePassword时,似乎没有正确设置pwd变量。我错过了什么?
答案 0 :(得分:0)
我确定问题是因为您的参数与表中的列完全相同。这只会引发问题。这是第一个修复的存储过程:
CREATE DEFINER=`prod`@`%` PROCEDURE `User_Create` (
IN v_login VARCHAR(45),
IN v_pwd VARCHAR(45),
IN v_fname VARCHAR(45),
IN v_lname VARCHAR(45),
IN v_email VARCHAR(45),
IN v_group_name VARCHAR(45)
)
BEGIN
INSERT INTO `Users`(`login`, `first_name`, `last_name`, `email`, `create_time`)
SELECT v_login, v_fname, v_lname, v_email, NOW();
CALL User_UpdatePassword(v_login, v_pwd);
INSERT INTO UserGroupsUsers(`group_id`, `user_id`)
SELECT ug.id, u.id
FROM UserGroups ug join
Users u
on ug.`name` = v_group_name AND u.`login` = v_login;
END;
如果您修复了其他存储过程,则应该解决问题。
请注意,我还修复了过时的连接语法。