MySQL存储过程 - 删除忽略'WHERE'子句

arc*_*tek 1 mysql sql database

我们有一个存储过程"GetToken",在用户登录我们的站点时调用.此存储过程生成GUID(将其返回给客户端)并将条目插入到"TokenIndex"表中.GUID仅在延长的时间段内有效,因此每次用户登录时,我们都会生成新的GUID并删除该特定用户的所有先前"TokenIndex"条目.我们遇到的问题(它让我们发疯)是delete语句正在删除"TokenIndex"表中的所有条目,就好像它忽略WHERE LoginID = loginIdDELETE 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)

pax*_*blo 7

我认为你的问题在于:

WHERE LoginID = loginId
Run Code Online (Sandbox Code Playgroud)

来自在线文档:

列,索引和存储的例程名称在任何平台上都不区分大小写,列别名也不区分大小写.触发器名称区分大小写,这与标准SQL不同.

换句话说,该条款可能被视为:

where 1 = 1
Run Code Online (Sandbox Code Playgroud)

因为它将选择所有行进行删除.

现在我不确定是不是这样,但应该很容易确认.

只需将所有出现的loginId(使用特定的字符组合)替换为,xyzzyLoginId并查看是否修复了它.