2011-12-13 77 views
1

我們有一個存儲過程「GetToken」,當用戶登錄到我們的網站時調用。此存儲過程生成一個GUID(將其返回給客戶端)並將條目插入到我們的「TokenIndex」表中。 GUID只在一段延長的時間內有效,所以每次用戶登錄時,我們都會生成一個新的GUID並刪除該特定用戶的所有以前的「TokenIndex」條目。我們遇到的問題是(它讓我們瘋狂)是刪除語句刪除「TokenIndex」表內的全部條目,就好像它忽略DELETE FROM TokenIndex語句中的WHERE LoginID = loginId子句。請參閱下面我們的存儲過程:MySQL存儲過程 - 刪除忽略'WHERE'子句

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

就在刪除之前,您可以發佈添加SELECT登錄ID的輸出loginId; –

回答

6

我覺得你的問題就在這裏:

WHERE LoginID = loginId 

online docs

列,索引和存儲程序的名稱不區分大小寫在任何平臺上,也不是列別名。觸發器名稱區分大小寫,與標準SQL不同。

換句話說,該條款可被處理的相同:

where 1 = 1 

在它將選擇要刪除所有行。

現在我不是某些就是這樣,但它應該很容易確認。

只需使用xyzzyLoginId取代的loginId所有出現(與具體字符的組合),看看能否解決。

+0

非常感謝你paxdiablo!我無法告訴你這對我們來說有多令人沮喪。再次,非常感謝! – arctek