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

时间:2011-12-13 04:36:51

标签: mysql sql database

我们有一个存储过程“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

1 个答案:

答案 0 :(得分:7)

我认为你的问题在于:

WHERE LoginID = loginId

来自online docs

  

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

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

where 1 = 1

因为它会选择所有行进行删除。

现在我不是某些就是这种情况,但应该很容易确认。

只需将loginId(使用特定字符组合)的所有匹配项替换为xyzzyLoginId,然后查看是否可以修复它。