Validar usuario para 3 tentativas de entrada de login

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
reenanneliaas
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 12
Registrado em: Ter, 02 Set 2014 11:01 am

aí galera, estou com uma pequena e simples dificuldade de validar o usuário.

Quero tentar fazer um script que o usuário tenha 3 tentativas para inserir seu login e senha. e tenho que fazer isso com laço de repetição ou seja um: while.
porem estou com a dificuldade de pedir que o usuário depois que inseriu errado tenha mais duas chances. e o script que fiz só faz uma, a finalidade desse script, é criar um script simples com while com base no meu banco de dados.

Abaixo está o script:

Selecionar tudo

create table Administrador(
ID_Administrador number(4) primary key not null,
Nome_Administrador varchar(30),
Email_Administrador varchar(100),
Senha_Admin varchar(16) not null);

INSERT INTO Administrador VALUES (1,'Felipe Silva','felipe@xama.com','felipe123');

DECLARE
v_idadmin    administrador.id_administrador%TYPE:=1;
v_senha       administrador.senha_admin%TYPE;
a                 number (2):=1;

    BEGIN

        SELECT ID_Administrador,Senha_Admin
        INTO v_idadmin,v_senha
        FROM Administrador;

            IF v_idadmin = :P_ID and v_senha = :P_SENHA THEN
            dbms_output.put_line ('Seja bem vindo');
            ELSE
                WHILE a = 1
                        LOOP
                           FOR i in i <3  
                              LOOP                                                       
                                 dbms_output.put_line ('Senha do usuário não confere');
                            
                               END LOOP;
                    a := a+1; 
                        dbms_output.put_line ('entre em contado com o Administrador do Sistema ');
                    END LOOP;
   
            END IF;
    END;
Editado pela última vez por stcoutinho em Ter, 02 Set 2014 3:57 pm, em um total de 1 vez.
Razão: Obs: Editado para facilitar a visualizacao do codigo PL/SQL
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Mas você vai usar o que pra ler do teclado a senha ?
Do jeito que você fez, ele ta buscando a senha da tabela. OU seja, é certo que a senha está correta.

Explica melhor pra gente.
reenanneliaas
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 12
Registrado em: Ter, 02 Set 2014 11:01 am

Como você pode verificar usei uma variável bind para inserir dados pelo teclado.
São essas:

Selecionar tudo

:P_ID e :P_SENHA 
Na hora de validar se o usuário é ou não existente, ta ok,
só queria saber como faço para o usuário inserir novamente seu login se ele errou pela primeira vez.

E assim o script permite que o usuário tente apenas 3 vezes.
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Você executa isso no SQL*Plus ?
Acho que não tem como pegar uma variável bind denovo.

Existe o comando ACCEPT, mas acho que ele não serve pra esse caso.

Selecionar tudo

ACCEPT senha CHAR PROMPT 'Digite sua senha:  ' HIDE
(pois é um comando do SQL*Plus e não do PLSQL).
reenanneliaas
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 12
Registrado em: Ter, 02 Set 2014 11:01 am

Eu executo no toad, acho melhor. rs
Pois é cara, acho que vou ter que estudar outra parte do meu banco para fazer esse loop.
já tentei diversas formas, colocar um IF dentro do FOR,
declarar uma variável para Somente capturar a entrada.
Mas essa variável que declaro, pede para mim declarar o dado de entrada do teclado, então não funciona, o jeito é estudar outro método.

Mais Obrigado pelo Interesse e pela ajuda. :D
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Assim, eu acho que "na vida real" esse seu caso é bem difícil de acontecer, porque você ta executando no TOAD, e ninguém vai fazer isso. (se você ta usando no TOAD, então você é programador, não precisa de um controle de acerto de senhas).

Eu faria uma FUNCTION que valida senha, que retorna TRUE ou FALSE.
Dentro dessa procedure, ele testa se acertou.
* Se errou, salva a data na tabela que errou e a quantidade de vezes que errou. (no caso 1).
* Se errou denovo, adiciona 1 na quantidade de vezes erradas.
* Se passar de 3 vezes, então ele vai ter que esperar, sei la, (uma hora) pra tentar denovo. (testar isso pela data do primeiro erro).
* Se acertou, limpa a quantidade de vezes e a data.

Ai sim, você pode usar isso em qualquer lugar e a function que vai fazer o todo o serviço.
reenanneliaas
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 12
Registrado em: Ter, 02 Set 2014 11:01 am

Estou começando agora a usar PL SQL,
Esse esquema de loop, eu tenho que fazer pra faculdade, porque se fosse fazer uma função eu acho que seria mais fácil com certeza.
Pois toda hora que o usuário errasse a procedure executava o False, e contava mais um na tabela como você mesmo falou, assim tendo mais duas tentativas.

é eu sei estou tentando fazer do jeito mais complicado. kkkkk
marlonpasquali
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 248
Registrado em: Sex, 06 Fev 2009 3:02 pm
Localização: ERECHIM - RS

Testa isso:

Selecionar tudo

DECLARE
v_idadmin    administrador.id_administrador%TYPE:=1;
v_senha       administrador.senha_admin%TYPE;
a                 number (2):=0;

    BEGIN

        SELECT ID_Administrador,Senha_Admin
        INTO v_idadmin,v_senha
        FROM Administrador;

            IF v_idadmin = :P_ID and v_senha = :P_SENHA THEN
               dbms_output.put_line ('Seja bem vindo');
            ELSE
                WHILE a <= 3 LOOP
                               IF v_idadmin = :P_ID and v_senha = :P_SENHA THEN                
                                 dbms_output.put_line ('Seja bem vindo');
                                 EXIT;
                               ELSE  
                                 dbms_output.put_line ('Senha do usuário não confere');
                                 dbms_output.put_line ('entre em contado com o Administrador do Sistema ');
                                 a := a+1;                                 
                               END IF;  
                END LOOP;
   
            END IF;
    END;
reenanneliaas
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 12
Registrado em: Ter, 02 Set 2014 11:01 am

Valeu cara pela sugestão.
mais fui percebe agora, uma variável bind só pode ser inserida 1 vez.
então quando ela vai no loop ela não pede para ser informada novamente, e sim pega os dados que você digitou no primeiro if, e apresenta as mensagens necessárias.

valeu pelo apoio pessoal. se eu conseguir solucionar isso apresento a resposta aqui.
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Parece que o professor pegou um exemplo em C usando "scanf" ou em java usando

Selecionar tudo

scan.nextLine();
e simplesmente pediu pro aluno fazer o exemplo em PLSQL.

Dai ele pensou: "Hmmm... Como fazer pra ler do teclado em oracle? Ah, é só botar um &var".

Mas não é a mesma coisa
:-(
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 14 visitantes