Função com UPDATE para trocar senha de um usuário

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
Eduardo Fernandes
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 25
Registrado em: Qua, 08 Dez 2010 10:36 pm
Localização: Rio de Janeiro

Preciso criar um função com um UPDATE para trocar a senha de um usuário para a default, que é 'inicial' (em md5= '306295F5DA7D45700CD1211EF21CBF62')

alguém poderia me dar uma ajuda?

Selecionar tudo

NOME DA TABELA = sec_membershipusers
NOME DO CAMPO DO USUÁRIO =  username 
NOME DO CAMPO DA SENHA = PASSWORD

Muito obrigado!!!!
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

e qual a sua dificuldade na elaboração dessa função?
Eduardo Fernandes
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 25
Registrado em: Qua, 08 Dez 2010 10:36 pm
Localização: Rio de Janeiro

Estou inciando em PL/ SQL

até agora consegui criar

Selecionar tudo


DECLARE 
NOME_USER VARCHAR2 := 'CLEBCODE'; -- clebcode é um usuário, pequei ele como exemplo para minha variável receber um valor

UPDATE FROM sec_membershipusers SET PASSWORD = '306295F5DA7D45700CD1211EF21CBF62' where username = NOME_USER

não sei se estou indo certo, se alguma coisa se salva do que eu fiz, se pode ser melhor...
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

vê se te ajuda...

Selecionar tudo


CREATE OR REPLACE PROCEDURE update_user(NOME_USER_P IN VARCHAR2,
                                        PASSWORD_P  IN VARCHAR2) AS
BEGIN
  UPDATE sec_membershipusers
     SET PASSWORD = PASSWORD_P
   where username = NOME_USER_P;
  COMMIT;
EXCEPTION
  WHEN OTHERS THEN
    ROLLBACK;
END update_user;
/
Eduardo Fernandes
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 25
Registrado em: Qua, 08 Dez 2010 10:36 pm
Localização: Rio de Janeiro

cara é por ai...

dei uma melhorada no meu codigo..

Selecionar tudo


CREATE OR REPLACE FUNCTION SC_FNC_TROCA_SENHA (p_NOME_USER in VARCHAR2) return boolean
  IS
v_coleta_user varchar2(300);

BEGIN

v_coleta_user:= select password from sec_membershipusers where username = 'WSTSCC';

UPDATE sec_membershipusers SET password = v_coleta_user where username = p_NOME_USER;

EXCEPTION
WHEN OTHERS THEN
return -- tenho que retornar se é true ou false.. não sei como faço é só colocar 'false'???

END SC_FNC_TROCA_SENHA;

criei um variável chamada v_coleta_user para receber uma select que busca o campo direto na tabela... uso sempre a senha do usuário WSTSCC como Default...

caso algum dia eu queira mudar a senha do WSTSCC gostaria que a mesmo senha fosse mudada também nos outros usuários..

é por ai?
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

boa zero meia... fatio passou!
=)

pode so troca aqui oh

Selecionar tudo

--de
v_coleta_user:= select password from sec_membershipusers where username = 'WSTSCC'; 

--por
select password  into v_coleta_user from sec_membershipusers where username = 'WSTSCC'; 

Eduardo Fernandes
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 25
Registrado em: Qua, 08 Dez 2010 10:36 pm
Localização: Rio de Janeiro

BELEZA.
PAROU DE RECLAMAR!

mas agora está dando erro no end ... não sei o que é

Selecionar tudo


CREATE OR REPLACE FUNCTION SC_FNC_TROCA_SENHA(p_NOME_USER in VARCHAR2)
  return boolean IS
  v_coleta_user varchar2(300);

BEGIN

  select password
    into v_coleta_user
    from sec_membershipusers
   where username = 'WSTSCC';

  UPDATE sec_membershipusers
     SET password = v_coleta_user
   where username = p_NOME_USER;

EXCEPTION
  WHEN OTHERS THEN
    return false;
  
END;

Eduardo Fernandes
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 25
Registrado em: Qua, 08 Dez 2010 10:36 pm
Localização: Rio de Janeiro

já descobri o que era..

era o meu true...

ficou assim

Selecionar tudo


CREATE OR REPLACE FUNCTION SC_FNC_TROCA_SENHA(p_NOME_USER in VARCHAR2:= 'JOAOMAER')
  return boolean IS
  v_coleta_user varchar2(300);

BEGIN

  select password
    into v_coleta_user
    from sec_membershipusers
   where username = 'WSTSCC';

  UPDATE sec_membershipusers
     SET password = v_coleta_user
   where username = p_NOME_USER;

return true;

EXCEPTION
  WHEN OTHERS THEN
    return false;
  

END SC_FNC_TROCA_SENHA;

Eduardo Fernandes
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 25
Registrado em: Qua, 08 Dez 2010 10:36 pm
Localização: Rio de Janeiro

Cara muito obrigado pela ajuda..

está funcionando numa boa!!!


Valeu!!!!
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Opa, se me permite uma sugestão, creio que talvez fique mais apropriado assim:

Selecionar tudo

CREATE OR REPLACE FUNCTION SC_FNC_TROCA_SENHA(p_NOME_USER in VARCHAR2)
  return boolean IS
  v_coleta_user varchar2(300);
BEGIN
  select password
    into v_coleta_user
    from sec_membershipusers
   where username = 'WSTSCC';

  UPDATE sec_membershipusers
     SET password = v_coleta_user
   where username = p_NOME_USER;

EXCEPTION
  WHEN NO_DATA_FOUND THEN
    return false;
END;
Dessa forma em caso do usuário não existir, e não ser encontrado, você recebe falso. Se ocorrer algum exception você precisa que o erro seja propagado para cima, para o chamador da function, ou seu procedimento terminará sem erro e você não tem como saber o que aconteceu de incorreto. Exception não esperado é erro e when others quase sempre não é uma boa prática.
Eduardo Fernandes
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 25
Registrado em: Qua, 08 Dez 2010 10:36 pm
Localização: Rio de Janeiro

Mas sem o Return true ele reclamou lá no End; .. só parou quando coloquei o Return...
Eduardo Fernandes
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 25
Registrado em: Qua, 08 Dez 2010 10:36 pm
Localização: Rio de Janeiro

Pensando no que o fsitja disse...

criei um exception para me retornar que tipo de erro está ocorrendo no select e no update...

Exemplo se o usuário não existir na base..

Mas estou meio confuso como fazer em relação a isso...

meu codigo ficou..

Selecionar tudo


CREATE OR REPLACE FUNCTION SC_FNC_TROCA_SENHA(p_NOME_USER in VARCHAR2)
  return boolean IS
  v_coleta_user varchar2(300);
  

BEGIN

BEGIN
  select password
    into v_coleta_user
    from sec_membershipusers
   where username = 'WSTSCC';
   
 EXCEPTION
  WHEN OTHERS THEN  
  RAISE_APPLICATION_ERROR(-20999,'ERRO - USUARIO NÃO EXISTE NA BASE');
  RETURN FALSE;  
END;

BEGIN
  UPDATE sec_membershipusers
     SET password = v_coleta_user
   where username = p_NOME_USER;
END;
RETURN TRUE;

EXCEPTION
  WHEN OTHERS THEN
  RAISE_APPLICATION_ERROR(-20998,'ERRO - SENHA NÃO TROCADA');
    return false;
  
END SC_FNC_TROCA_SENHA;

quando tento fazer um teste e digito um usuário que não existe no banco ele me retorna o valor 1...
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Olá, falha minha, cara, copiei e colei sem o return true... :oops:

A questão é que quando ocorre o erro e o raise_application_error é disparado, o "return false" não chega a rodar nunca, pois o raise "ejeta" com erro para o nível superior.

Teria que escolher: ou retorna false ou retorna erro. Os dois não é possível. Na minha opinião retornar o erro é a melhor alternativa, para que ele seja tratato da forma apropriada pelo programa chamador e pelo front end.
Eduardo Fernandes
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 25
Registrado em: Qua, 08 Dez 2010 10:36 pm
Localização: Rio de Janeiro

mas cara como posso retornar o erro??

não estou conseguindo...
diegopedrao
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 164
Registrado em: Sex, 22 Ago 2008 12:28 pm
Localização: SP

Eduardo,

é so ao invés de ter 2 chamadas no exception, você coloca somente uma.

Victor vou usar seu código:

Selecionar tudo

CREATE OR REPLACE FUNCTION SC_FNC_TROCA_SENHA(p_NOME_USER in VARCHAR2) 
  return boolean IS 
  v_coleta_user varchar2(300); 
  

BEGIN 

BEGIN 
  select password 
    into v_coleta_user 
    from sec_membershipusers 
   where username = 'WSTSCC'; 
    
 EXCEPTION 
  WHEN OTHERS THEN  
  RAISE_APPLICATION_ERROR(-20999,'ERRO - USUARIO NÃO EXISTE NA BASE'); 
  RETURN FALSE;  
END; 

BEGIN 
  UPDATE sec_membershipusers 
     SET password = v_coleta_user 
   where username = p_NOME_USER; 
END; 
RETURN TRUE; 

EXCEPTION 
  WHEN OTHERS THEN 
  RAISE_APPLICATION_ERROR(-20998,'ERRO - SENHA NÃO TROCADA'); 
END SC_FNC_TROCA_SENHA; 

Att,

Diego Monteiro
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

A sua função, pelo que posso ver, já está retornando o erro. Mas a saída vai depender de como o erro é tratado pelo programa que chama a function. A chamada precisa ter tratamento caso retorne erro, ou então jogar para o nível de cima até chegar no front end.

Selecionar tudo

CREATE OR REPLACE FUNCTION SC_FNC_TROCA_SENHA(p_NOME_USER in VARCHAR2)
  return boolean IS
  v_coleta_user varchar2(300);
 

BEGIN

BEGIN
  select password
    into v_coleta_user
    from sec_membershipusers
   where username = 'WSTSCC';
   
 EXCEPTION
  WHEN NO_DATA_FOUND THEN 
  RAISE_APPLICATION_ERROR(-20999,'ERRO - USUARIO NÃO EXISTE NA BASE');
END;

BEGIN
  UPDATE sec_membershipusers
     SET password = v_coleta_user
   where username = p_NOME_USER;
END;
RETURN TRUE;

EXCEPTION
  WHEN OTHERS THEN
  RAISE_APPLICATION_ERROR(-20998,'ERRO - SENHA NÃO TROCADA');
END SC_FNC_TROCA_SENHA; 
Modifiquei acima apenas o when others, que fica when no_data_found. Afinal, o usuário não existe apenas se ocorre no_data_found... qualquer outro erro não quer dizer que ele não foi encontrado.

Removi também o return false, pois em caso de exception o retorno não será processado, e é indeterminado.
Eduardo Fernandes
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 25
Registrado em: Qua, 08 Dez 2010 10:36 pm
Localização: Rio de Janeiro

fsitja coloquei o no_data_found then..

mu código ficou assim

Selecionar tudo


CREATE OR REPLACE FUNCTION SC_FNC_TROCA_SENHA(p_NOME_USER in VARCHAR2)
  return varchar2 IS
  v_coleta_user varchar2(300);

BEGIN

  BEGIN
    select password
      into v_coleta_user
      from sec_membershipusers
     where username = p_NOME_USER;
  
  EXCEPTION
    WHEN NO_DATA_FOUND THEN
      return 'ERRO - Usuário não existe na base';
    
  END;

  BEGIN
    select password
      into v_coleta_user
      from sec_membershipusers
     where username = 'WSTSCC';
  
  EXCEPTION
    WHEN OTHERS THEN
      RETURN '1 - ERRO AO TENTAR TROCAR SENHA' || SQLERRM;
    
  END;

  BEGIN
    UPDATE sec_membershipusers
       SET password = v_coleta_user
     where username = p_NOME_USER;
  
  EXCEPTION
    WHEN OTHERS THEN
      RETURN 'ERRO - Erro na troca' || SQLERRM;
  END;

  RETURN 'SENHA MODIFICDA';

END SC_FNC_TROCA_SENHA;


minha dúvida é... ultimo return só é retornado se tudo for concluído com sucesso???
nozes
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 10
Registrado em: Qui, 23 Dez 2010 2:06 pm
Localização: Mesquita-RJ
Emanuel "Nozes" Castro
Analista Programador

Eae velhinho...
Cara, saca só...
Não entendi direito o que esse teu script ta fazendo...porque na verdade ele recebe o parametro com o suposto usuario, o qual ira ser alterado a senha...a senha pelo jeito já é padrão...
Ai você usa sua variavel para receber diversos valores...
acho q "bagunçamos" a casa um pouco....vou reescreve-lo, e você me diz se atende sua necessidade...

Selecionar tudo

CREATE OR REPLACE FUNCTION SC_FNC_TROCA_SENHA(p_NAME_USER in VARCHAR2)
  return varchar2 IS

BEGIN


  UPDATE sec_membershipusers
     SET PASSWORD = '306295F5DA7D45700CD1211EF21CBF62'
   WHERE USERNAME = p_NAME_USER;


   IF SQL%ROWCOUNT = 0 THEN
   COMMIT;
      RETURN 'NENHUMA LINHA ALTERADA';
   ELSE
   COMMIT;
   RETURN 'SENHA ALTERADA COM SUCESSO!';
   END IF;

END SC_FNC_TROCA_SENHA;
Responde aí...pra podermos resovler essa parada!
;)
abs :-o
Responder
  • Informação
  • Quem está online

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