我们有一个存储过程"GetToken",当用户登录到我们的网站时调用。这个存储过程生成一个GUID(将其返回给客户端),并在"TokenIndex"表中插入一个条目。GUID仅在一段较长的时间内有效,因此每次用户登录时,我们都会生成一个新的GUID,并删除该特定用户的所有先前的"TokenIndex"条目。我们遇到的问题(它让我们抓狂)是delete语句删除了"TokenIndex"表中的所有条目,就好像它忽略了DELETE FROM TokenIndex
语句中的WHERE LoginID = loginId
子句一样。下面是我们的存储过程:
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
我想你的问题在这里:
WHERE LoginID = loginId
从在线文档:
列、索引和存储例程名称在任何平台上都不区分大小写,列别名也不区分大小写。触发器名称区分大小写,这与标准SQL不同。
换句话说,该子句可能被视为:
where 1 = 1
,它将选择所有行进行删除。
现在我不确定是这种情况,但应该很容易确认。
简单地用xyzzyLoginId
替换所有出现的loginId
(使用特定的字符组合),看看是否修复了它。