【问题标题】:Change password procedure PLSQL using IN and OUT parameters使用 IN 和 OUT 参数更改密码过程 PLSQL
【发布时间】:2018-05-23 18:19:33
【问题描述】:

晚上好!

我正在尝试在 PLSQL 中创建一个可以更改用户密码的存储过程。我想检查当前密码是否正确,然后我将更新用户密码或打印错误。到目前为止,我想出的是以下代码。我正在努力使用不同的参数以及如何使用它们来检查密码是否正确。有人可以给我小费吗?任何建议表示赞赏!

CREATE OR REPLACE PROCEDURE CHANGE_PWD (
    P_USERNAME   IN     USERS.USERNAME%TYPE,
    P_OLD_PW     IN     USERS.PASSWORD%TYPE,
    P_NEW_PW     IN     USERS.PASSWORD%TYPE,
    P_SUCCES        OUT BOOLEAN)
IS
BEGIN
    SELECT USERS.PASSWORD
      INTO P_OLD_PW
      FROM USERS
     WHERE USERS.USERNAME = p_username;

    IF p_old_pw = USERS.PASSWORD
    THEN
        UPDATE USERS
           SET PASSWORD = p_new_pw
         WHERE USERS.USERNAME = p_username;
    ELSE
        RETURN < error message > ;
    END IF;
END CHANGE_PWD;

【问题讨论】:

  • 哎哟......密码永远不应该被存储。

标签: authentication plsql passwords procedure


【解决方案1】:

这是一个选项。

首先,一张测试表:

SQL> create table users
  2    (username varchar2(30),
  3     password varchar2(20));

Table created.

SQL> insert into users values ('LITTLEFOOT', '2cellos');

1 row created.

程序;我建议您返回一个字符串,而不是布尔值(使用它更容易):

SQL> create or replace procedure change_pwd
  2    (p_username   in users.username%type,
  3     p_old_pw     in users.password%type,
  4     p_new_pw     in users.password%type,
  5     p_success   out varchar2
  6    )
  7  is
  8    l_old_pw  users.password%type;
  9  begin
 10    select password
 11      into l_old_pw
 12      from users
 13      where username = p_username;
 14
 15    if l_old_pw = p_old_pw then
 16       -- OK, old password matches
 17       update users set
 18         password = p_new_pw
 19         where username = p_username;
 20       p_success := 'Password changed';
 21    else
 22       p_success := 'Invalid old password';
 23    end if;
 24  exception
 25    when no_data_found then
 26      p_success := 'Invalid username';
 27  end;
 28  /

Procedure created.

测试:

SQL> set serveroutput on;
SQL> declare
  2    l_succ varchar2(100);
  3  begin
  4    change_pwd('LITTLEFOOT', 'xyz', 'newpwd', l_succ);
  5    dbms_output.put_line(l_succ);
  6
  7    change_pwd('bigFOOT', 'abc', 'newpwd', l_succ);
  8    dbms_output.put_line(l_succ);
  9
 10    change_pwd('LITTLEFOOT', '2cellos', 'newpwd', l_succ);
 11    dbms_output.put_line(l_succ);
 12  end;
 13  /
Invalid old password
Invalid username
Password changed

PL/SQL procedure successfully completed.

SQL>

【讨论】:

    【解决方案2】:

    你有一些错误

    CREATE OR REPLACE PROCEDURE CHANGE_PWD (P_USERNAME IN USERS.USERNAME %TYPE,                                         
                                        P_OLD_PW   USERS.PASSWORD%TYPE,                                     
                                        P_NEW_PW IN USERS.PASSWORD %TYPE, 
                                        P_SUCCES OUT BOOLEAN ) IS
     VC_OLD_PW   USERS.PASSWORD%TYPE;
    
     BEGIN
    
        SELECT U.PASSWORD 
          INTO VC_OLD_PW 
          FROM USERS U
         WHERE U.USERNAME = p_username;
    
       /*Validate old pass*/
       IF VC_OLD_PW = USERS.PASSWORD THEN
          UPDATE USERS
             SET PASSWORD = p_new_pw
           WHERE USERS.USERNAME = p_username;
           COMMIT;
          --Ok change
          P_SUCCES   := TRUE;
       ELSE 
          --Change fail
          P_SUCCES  := FALSE;
          --RETURN <error message>; //This is unnecesary    
       END IF;
    
    EXCEPTION
    //Any exception
    WHEN OTHERS THEN    
        P_SUCCES  := FALSE;   
        DBMS_OUTPUT.PUT_LINE('Error in procedure CHANGE_PWD '||SQLERRM)
    END CHANGE_PWD;
    

    您需要对此进行更多研究,但这很正常。

    问候。

    【讨论】:

    • 感谢您的澄清。我特别忘记了变量,这真的很有帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-19
    • 1970-01-01
    • 2011-07-29
    • 2012-04-18
    • 1970-01-01
    • 2020-09-22
    • 2021-05-18
    相关资源
    最近更新 更多