如何在storedProcedure中使用IF条件?

时间:2018-12-15 16:50:16

标签: mysql if-statement case

在使用固定的密码尝试了几次之后,我正在使用一种条件来锁定登录帐户。更新部分如下:

首先从登录帐户中读取

loginAttempts(INT(1))

DECLARE LoginAttempts   INT(1);
UPDATE login SET 
LOGIN_ACCOUNT_STATUS = (SELECT CASE (LoginAttempts > MaxLoginAttempts) WHEN 1 THEN 'LOCKED' ELSE 'ACTIVE' END),
LOGIN_LOGIN_ATTEMPTS = (SELECT CASE (@USER_FOUND AND @PASSWORD_CORRECT) WHEN 1 THEN 0 ELSE LOGIN_LOGIN_ATTEMPTS + 1 END),
LOGIN_LAST_LOGIN_DATE = (SELECT CASE (@USER_FOUND AND @PASSWORD_CORRECT) WHEN 1 THEN TransactionDateTime ELSE LOGIN_LAST_LOGIN_DATE END),
LOGIN_LAST_LOGIN_LOCATION = null 
WHERE LOGIN_EMAIL = UserEmail;

当我将MaxLoginAttmpts设置为5时,该帐户被锁定为11(大于maxLoginAttempts的两倍)。 如果我将MaxLoginAttmpts设置为2,则帐户将被锁定为5(大于maxLoginAttempts的两倍)。

这是为什么?任何帮助表示赞赏。

在这里,我要添加完整的存储过程。

 CREATE DEFINER=`pubuducg`@`%` PROCEDURE `CustomerAuthenticate`(IN UserEmail VARCHAR(100), IN PassWD VARCHAR(40), IN AccStatus VARCHAR(100),IN TransactionDateTime DATETIME, IN MaxLoginAttempts INT(1))
BEGIN
DECLARE LoginUserID     INT(11);
DECLARE LoginEmail      VARCHAR(50);
DECLARE LoginPassword   TINYTEXT;
DECLARE LoginAttempts   INT(1);
DECLARE AccountStatus   VARCHAR(45);
DECLARE UserRoles       VARCHAR(80);
SELECT 
login.LOGIN_USER_ID,
login.LOGIN_EMAIL,
login.LOGIN_PASSWORD,
login.LOGIN_ACCOUNT_STATUS,
login.LOGIN_LOGIN_ATTEMPTS,
GROUP_CONCAT(user_role.USER_ROLE_ROLE SEPARATOR ',') AS ROLES
INTO
LoginUserID,
LoginEmail,
LoginPassword,
AccountStatus,
LoginAttempts,
UserRoles
FROM login 
INNER JOIN user_role ON 
user_role.USER_ROLE_USER_ID = login.LOGIN_USER_ID AND user_role.USER_ROLE_STATUS = AccStatus 
WHERE login.LOGIN_EMAIL = UserEmail;

SET @USER_FOUND = found_rows();
SET @PASSWORD_CORRECT = IF((LoginPassword = PassWD AND AccountStatus = AccStatus), true, false);

UPDATE login SET 
LOGIN_ACCOUNT_STATUS = (SELECT CASE (LoginAttempts > MaxLoginAttempts) WHEN 1 THEN 'LOCKED' ELSE 'ACTIVE' END),
LOGIN_LOGIN_ATTEMPTS = (SELECT CASE (@USER_FOUND AND @PASSWORD_CORRECT) WHEN 1 THEN 0 ELSE LOGIN_LOGIN_ATTEMPTS + 1 END),
LOGIN_LAST_LOGIN_DATE = (SELECT CASE (@USER_FOUND AND @PASSWORD_CORRECT) WHEN 1 THEN TransactionDateTime ELSE LOGIN_LAST_LOGIN_DATE END),
LOGIN_LAST_LOGIN_LOCATION = null 
WHERE LOGIN_EMAIL = UserEmail;

SELECT 
IF(@USER_FOUND AND @PASSWORD_CORRECT, LoginUserID,0) AS USER_ID,
@PASSWORD_CORRECT AS AUTHENTICATED,
@USER_FOUND AS USER_EXISTS,
AccountStatus AS ACCOUNT_STATUS,
IF(@USER_FOUND AND @PASSWORD_CORRECT, 0, LoginAttempts + 1) AS LOGIN_ATTEMPTS,
IF(@USER_FOUND AND @PASSWORD_CORRECT, UserRoles,null) AS USER_ROLES;
END

0 个答案:

没有答案
相关问题