MySQL存储过程-删除忽略“WHERE”子句
我们有一个存储过程GetToken,当用户登录到我们的站点时调用它。此存储过程生成一个GUID,将其返回给客户端,并在TokenIndex表中插入一个条目。GUID只在一段较长的时间内有效,因此每次用户登录时,我们都会生成一个新的GUID并删除该特定用户以前的所有TokenIndex项。我们遇到的问题是delete语句正在删除TokenIndex表中的所有条目,这让我们抓狂,就好像它忽略了delete FROM TokenIndex语句中的WHERE LoginID=LoginID子句一样。请参阅下面的存储过程:MySQL存储过程-删除忽略“WHERE”子句,mysql,sql,database,Mysql,Sql,Database,我们有一个存储过程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
因为它将选择要删除的所有行
现在我不确定情况是否如此,但这应该很容易确认
只需将所有出现的loginId替换为具有xyzzyLoginId的特定字符组合,然后看看是否可以修复它。我认为您的问题在于:
WHERE LoginID = loginId
从:
列、索引和存储的例程名称在任何平台上都不区分大小写,列别名也不区分大小写。触发器名称区分大小写,这与标准SQL不同
换言之,该条款可被视为:
where 1 = 1
因为它将选择要删除的所有行
现在我不确定情况是否如此,但这应该很容易确认
只需使用xyzzyLoginId的特定字符组合替换所有出现的loginId,并查看是否修复了它。在删除之前,您是否可以发布添加SELECT loginId、loginId的输出;在删除之前,您可以发布添加SELECT LoginID的输出,LoginID;非常感谢你,帕斯迪亚布洛!我不能告诉你这对我们有多沮丧。再次感谢!非常感谢你,帕斯迪亚布洛!我不能告诉你这对我们有多沮丧。再次感谢!