Хранимая процедура MySQL - удаление, игнорируя предложение WHERE - PullRequest
1 голос
/ 13 декабря 2011

У нас есть хранимая процедура «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

1 Ответ

7 голосов
/ 13 декабря 2011

Я думаю, что ваша проблема заключается здесь:

WHERE LoginID = loginId

Из онлайн-документов :

Имена столбцов, индексов и хранимых процедур не имеют значениячувствительны на любой платформе, а также псевдонимы столбцов.Имена триггеров чувствительны к регистру, что отличается от стандартного SQL.

Другими словами, это предложение может обрабатываться так же, как:

where 1 = 1

в том смысле, что оно будет выбирать все строки для удаления.

Теперь я не уверен , что это так, но это должно быть довольно легко подтвердить.

Просто замените все вхождения loginId (с этим определенным комбинация символов) с xyzzyLoginId и посмотрите, исправит ли это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...