我们有一个存储过程“GetToken”,在用户登录我们的站点时调用。此存储过程生成GUID(将其返回给客户端)并将条目插入到“TokenIndex”表中。 GUID仅在延长的时间段内有效,因此每次用户登录时,我们都会生成新的GUID并删除该特定用户的所有先前“TokenIndex”条目。我们遇到的问题(这让我们感到疯狂)是删除语句正在删除“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
答案 0 :(得分:7)
我认为你的问题在于:
WHERE LoginID = loginId
来自online docs:
列,索引和存储的例程名称在任何平台上都不区分大小写,列别名也不区分大小写。触发器名称区分大小写,这与标准SQL不同。
换句话说,该条款可能被视为:
where 1 = 1
因为它会选择所有行进行删除。
现在我不是某些就是这种情况,但应该很容易确认。
只需将loginId
(使用特定字符组合)的所有匹配项替换为xyzzyLoginId
,然后查看是否可以修复它。