Stack Overflow en español Asked by user183157 on December 30, 2021
def NOMBRE(LISTA_DE_PARAMETROS):
"""DOCSTRING_DE_FUNCION"""
SENTENCIAS
RETURN [EXPRESION]
def hola(arg):
… """El docstring de la función"""
… print "Hola", arg, "!"
…
hola("Plone")
Hola Plone !
El problema que tienes es que al estar por separado el evaluar IF CONTEO2 = 0 THEN...
cuando esto se cumpla, sin importar donde entre en IF CONTEO = 1 THEH ... ELSE ...
en cualquiera te devolverá PRESULTADO = 'DESHABILITADO'
; ahora bien lo que debes hacer (mi sugerencia) es lo siguiente:
CREATE DEFINER=`n_devsacfi`@`%` PROCEDURE `INHA_SP_LOGIN`(
IN PUSU VARCHAR(50),
IN PCONTRA VARCHAR(50),
IN IP VARCHAR(20),
OUT PRESULTADO VARCHAR(20)
#OUT USUARIO VARCHAR(50),
#OUT ROL VARCHAR(100)
)
BEGIN
DECLARE CONTEO /*, CONTEO2, CONTEO3*/ INT; /* Con una sola variable */
/*CHECAR SI ES USUARIO ACTIVO*/
/* Lo primero es revisar que los datos de autenticación proporcionados corresponde a un usuario */
SELECT COUNT(*) INTO CONTEO FROM INHA_DET_CFGUSUARIOS WHERE CUSU_CUSUARIO = PUSU AND CUSU_CCONTRASENIA = PCONTRA /*AND CUSU_NESTATUSUSUARIO = 1*/; /* No checar si esta o no activo */
/*CHECAR SI ES USUARIO INACTIVO*/
/* SELECT COUNT(*) INTO CONTEO2 FROM INHA_DET_CFGUSUARIOS WHERE CUSU_CUSUARIO = PUSU AND CUSU_CCONTRASENIA = PCONTRA AND CUSU_NESTATUSUSUARIO = 0; */ /* Ya no ejecutar esto aquí */
IF CONTEO = 1 THEN
/* Aquí llega si los datos de autenticación son correctos */
/* Ahora verificas el "CUSU_NESTATUSUSUARIO" */
SELECT COUNT(*) INTO CONTEO FROM INHA_DET_CFGUSUARIOS WHERE CUSU_CUSUARIO = PUSU AND CUSU_CCONTRASENIA = PCONTRA AND CUSU_NESTATUSUSUARIO = 1;
IF CONTEO=1 THEN
SELECT US.CUSU_CUSUARIO AS USUARIO , USUROL.CUSR_NIDROL AS ROL
FROM INHA_DET_CFGUSUARIOS US
INNER JOIN INHA_DET_CFGUSUROL USUROL ON USUROL.CUSR_NIDUSUARIO = US.CUSU_NIDUSUARIO
INNER JOIN INHA_MST_CFGROLES ROLS ON ROLS.CFRO_NIDROL = USUROL.CUSR_NIDROL WHERE US.CUSU_CUSUARIO = PUSU AND US.CUSU_CCONTRASENIA = PCONTRA AND US.CUSU_NESTATUSUSUARIO = 1;
SET PRESULTADO = 'OK';
ELSE
SELECT US.CUSU_CUSUARIO AS USUARIO , USUROL.CUSR_NIDROL AS ROL
FROM INHA_DET_CFGUSUARIOS US
INNER JOIN INHA_DET_CFGUSUROL USUROL ON USUROL.CUSR_NIDUSUARIO = US.CUSU_NIDUSUARIO
INNER JOIN INHA_MST_CFGROLES ROLS ON ROLS.CFRO_NIDROL = USUROL.CUSR_NIDROL WHERE US.CUSU_CUSUARIO = PUSU AND US.CUSU_CCONTRASENIA = PCONTRA OR US.CUSU_CCONTRASENIA <> PCONTRA AND US.CUSU_NESTATUSUSUARIO = 0;
SET PRESULTADO = 'DESHABILITADO';
END IF;
ELSE
/* Aquí llega si uno o ambos datos de autenticación es/son incorrecto(s) */
/* Veo en casa caso siempre aplicas un consulta, verifica cual aplicaria aquì para tu caso */
SELECT US.CUSU_CUSUARIO AS USUARIO , USUROL.CUSR_NIDROL AS ROL
FROM INHA_DET_CFGUSUARIOS US
INNER JOIN INHA_DET_CFGUSUROL USUROL ON USUROL.CUSR_NIDUSUARIO = US.CUSU_NIDUSUARIO
INNER JOIN INHA_MST_CFGROLES ROLS ON ROLS.CFRO_NIDROL = USUROL.CUSR_NIDROL WHERE US.CUSU_CCONTRASENIA != PCONTRA /*AND US.CUSU_NESTATUSUSUARIO = 1*/;
/* SET PRESULTADO = 'CONTRASEÑA'; */
SET PRESULTADO = 'USUARIO Y/O CONTRASEÑA INCORRECTA'; /* Damos entender que uno o todos los datos de autenticación està(n) mal; por seguridad no decimos cual */
END IF;
En el código que pegaste parece falta el
END;
delBEGIN
no lo coloque para respetar lo que proporcionaste en su estructura.
La clave esta en partir de lo básico e ir a lo más especifico conforme quieras ser muy detallado en tu mensaje; lo que te comente era que tu código:
IF CONTEO = 1 THEN
SELECT US.CUSU_CUSUARIO AS USUARIO , USUROL.CUSR_NIDROL AS ROL
FROM INHA_DET_CFGUSUARIOS US
INNER JOIN INHA_DET_CFGUSUROL USUROL ON USUROL.CUSR_NIDUSUARIO = US.CUSU_NIDUSUARIO
INNER JOIN INHA_MST_CFGROLES ROLS ON ROLS.CFRO_NIDROL = USUROL.CUSR_NIDROL WHERE US.CUSU_CUSUARIO = PUSU AND US.CUSU_CCONTRASENIA = PCONTRA AND US.CUSU_NESTATUSUSUARIO = 1;
SET PRESULTADO = 'OK';
ELSE
SELECT US.CUSU_CUSUARIO AS USUARIO , USUROL.CUSR_NIDROL AS ROL
FROM INHA_DET_CFGUSUARIOS US
INNER JOIN INHA_DET_CFGUSUROL USUROL ON USUROL.CUSR_NIDUSUARIO = US.CUSU_NIDUSUARIO
INNER JOIN INHA_MST_CFGROLES ROLS ON ROLS.CFRO_NIDROL = USUROL.CUSR_NIDROL WHERE US.CUSU_CCONTRASENIA != PCONTRA AND US.CUSU_NESTATUSUSUARIO = 1;
SET PRESULTADO = 'CONTRASEÑA';
END IF;
IF CONTEO2 = 0 THEN
SELECT US.CUSU_CUSUARIO AS USUARIO , USUROL.CUSR_NIDROL AS ROL
FROM INHA_DET_CFGUSUARIOS US
INNER JOIN INHA_DET_CFGUSUROL USUROL ON USUROL.CUSR_NIDUSUARIO = US.CUSU_NIDUSUARIO
INNER JOIN INHA_MST_CFGROLES ROLS ON ROLS.CFRO_NIDROL = USUROL.CUSR_NIDROL WHERE US.CUSU_CUSUARIO = PUSU AND US.CUSU_CCONTRASENIA = PCONTRA OR US.CUSU_CCONTRASENIA <> PCONTRA AND US.CUSU_NESTATUSUSUARIO = 0;
SET PRESULTADO = 'DESHABILITADO';
END IF;
quedara de la siguiente forma:
IF CONTEO = 1 THEN
SELECT US.CUSU_CUSUARIO AS USUARIO , USUROL.CUSR_NIDROL AS ROL
FROM INHA_DET_CFGUSUARIOS US
INNER JOIN INHA_DET_CFGUSUROL USUROL ON USUROL.CUSR_NIDUSUARIO = US.CUSU_NIDUSUARIO
INNER JOIN INHA_MST_CFGROLES ROLS ON ROLS.CFRO_NIDROL = USUROL.CUSR_NIDROL WHERE US.CUSU_CUSUARIO = PUSU AND US.CUSU_CCONTRASENIA = PCONTRA AND US.CUSU_NESTATUSUSUARIO = 1;
SET PRESULTADO = 'OK';
ELSEIF CONTEO2 = 0 THEN
SELECT US.CUSU_CUSUARIO AS USUARIO , USUROL.CUSR_NIDROL AS ROL
FROM INHA_DET_CFGUSUARIOS US
INNER JOIN INHA_DET_CFGUSUROL USUROL ON USUROL.CUSR_NIDUSUARIO = US.CUSU_NIDUSUARIO
INNER JOIN INHA_MST_CFGROLES ROLS ON ROLS.CFRO_NIDROL = USUROL.CUSR_NIDROL WHERE US.CUSU_CUSUARIO = PUSU AND US.CUSU_CCONTRASENIA = PCONTRA OR US.CUSU_CCONTRASENIA <> PCONTRA AND US.CUSU_NESTATUSUSUARIO = 0;
SET PRESULTADO = 'DESHABILITADO';
ELSE
SELECT US.CUSU_CUSUARIO AS USUARIO , USUROL.CUSR_NIDROL AS ROL
FROM INHA_DET_CFGUSUARIOS US
INNER JOIN INHA_DET_CFGUSUROL USUROL ON USUROL.CUSR_NIDUSUARIO = US.CUSU_NIDUSUARIO
INNER JOIN INHA_MST_CFGROLES ROLS ON ROLS.CFRO_NIDROL = USUROL.CUSR_NIDROL WHERE US.CUSU_CCONTRASENIA != PCONTRA AND US.CUSU_NESTATUSUSUARIO = 1;
SET PRESULTADO = 'CONTRASEÑA';
END IF;
Pero en caso que se proporcione mal el usuario y/o contraseña (exista o no) tanto conteo
como conteo2
serían 0 (cero) y reportarias. Bueno esto por lo que cheque.
Answered by RobertoLeOr on December 30, 2021
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP