arc*_*tek 1 mysql sql database
我们有一个存储过程"GetToken",在用户登录我们的站点时调用.此存储过程生成GUID(将其返回给客户端)并将条目插入到"TokenIndex"表中.GUID仅在延长的时间段内有效,因此每次用户登录时,我们都会生成新的GUID并删除该特定用户的所有先前"TokenIndex"条目.我们遇到的问题(它让我们发疯)是delete语句正在删除"TokenIndex"表中的所有条目,就好像它忽略WHERE LoginID = loginId了DELETE FROM TokenIndex语句中的子句一样.请参阅下面的存储过程:
CREATE DEFINER=`arcanatekauth`@`%` PROCEDURE `GetToken`(
IN _username NVARCHAR(100),
IN _password TINYBLOB
)
BEGIN
declare guid CHAR(36);
declare clientId int;
declare loginId int;
declare clientConnectionString nvarchar(500);
Select li.ClientID, li.ID INTO clientId, loginId
FROM LoginIndex li
WHERE li.UserName = _username and li.Password = _password;
if(clientId > 0)
then
begin
SET guid = UUID();
DELETE FROM TokenIndex
WHERE LoginID = loginId;
SELECT ci.ConnectionString INTO clientConnectionString
FROM ClientIndex ci
WHERE ci.ID = clientId;
INSERT INTO TokenIndex (Token, LoginID, ConnectionString, ExpirationDtTm)
VALUES (guid, loginId, clientConnectionString, NOW() + INTERVAL 1 HOUR);
end;
end if;
select guid;
END
Run Code Online (Sandbox Code Playgroud)
我认为你的问题在于:
WHERE LoginID = loginId
Run Code Online (Sandbox Code Playgroud)
来自在线文档:
列,索引和存储的例程名称在任何平台上都不区分大小写,列别名也不区分大小写.触发器名称区分大小写,这与标准SQL不同.
换句话说,该条款可能被视为:
where 1 = 1
Run Code Online (Sandbox Code Playgroud)
因为它将选择所有行进行删除.
现在我不确定是不是这样,但应该很容易确认.
只需将所有出现的loginId(使用特定的字符组合)替换为,xyzzyLoginId并查看是否修复了它.