【问题标题】:Oracle password generator for EBS database usersEBS 数据库用户的 Oracle 密码生成器
【发布时间】:2021-04-27 20:49:20
【问题描述】:

我有一项任务需要更改当前 EBS 189 模式 (Oracle 12.1) 的密码。我已经创建了查询如何一次性管理它:

select 'FNDCPASS APPS/atesta 0 Y SYSTEM/test ORACLE '||oracle_username||' '||password||'' oracle_username from FND_ORACLE_USERID
where READ_ONLY_FLAG='A'

所以我的问题是如何用随机生成的密码替换查询中的密码字? 密码必须至少有 15 个字符、1 个特殊字符、1 个数字和 1 个大写字母。

有什么想法吗?

谢谢

【问题讨论】:

    标签: oracle plsql


    【解决方案1】:
    1. 您可以创建一个函数来返回此类随机密码并在查询中使用它:
    -- function:
    with 
    function get_rand_pass(n in number) return varchar2 as
      res varchar2(15);
    begin
       loop
         res:=DBMS_RANDOM.STRING('p',15);
         exit when
              regexp_like(res,'[^a-zA-Z0-9]') -- special char
          and regexp_like(res,'\d') -- at least one number
          and regexp_like(res,'[A-Z]') -- at least one UPPER letter
          ;
       end loop;
       return res;
    end;
    -- end of function
    -- test query:
    select 
       get_rand_pass(dbms_random.value()) pass
    from dual;
    

    完整示例:

    with 
    function get_rand_pass(n in number) return varchar2 as
      res varchar2(15);
    begin
       loop
         res:=DBMS_RANDOM.STRING('p',15);
         exit when
              regexp_like(res,'[^a-zA-Z0-9]') -- special char
          and regexp_like(res,'\d') -- at least one number
          and regexp_like(res,'[A-Z]') -- at least one UPPER letter
          ;
       end loop;
       return res;
    end;
    select 
       get_rand_pass(dbms_random.value()) pass
    from dual
    connect by level<=10
    /
    
    PASS
    ---------------
    C7Bncs'bH9+Hx&p
    kHG<&4Aw36VS3W
    np xvyvM]3In #{
    %A1&+}XVNyBvL'%
    +,Bp hII\q,&7>V
    h@l` kE(b4=-C</
    (c{7"`~UvN44#e/
    <_s+4G!nlujcytJ
    {[a2{*sXW;;$#<.
    7)^>Qj4!1MTm?};
    
    10 rows selected.
    
    1. 或在您的查询中使用以下子查询:
      (
      select pass
      from
        (select DBMS_RANDOM.STRING('p',15) pass from dual connect by level<=1e5)
      where
        rownum=1 -- first pass
        and regexp_like(pass,'[^a-zA-Z0-9]') -- special char
        and regexp_like(pass,'\d') -- at least one number
        and regexp_like(pass,'[A-Z]') -- at least one UPPER letter
      ) pass
    

    但它可能会被缓存(scalar subquery caching),如果你使用这种生成器的交叉连接,它可能在hash join中只执行一次,所以它需要一个解决方法,例如:

    select--+ use_nl(pass_gen)
      *
    from FND_ORACLE_USERID,
      lateral(
        select--+ no_merge no_unnest
           pass
        from
          (select DBMS_RANDOM.STRING('p',15) pass from dual connect by level<=1e5)
        where
          rownum=1 -- first pass
          and regexp_like(pass,'[^a-zA-Z0-9]') -- special char
          and regexp_like(pass,'\d') -- at least one number
          and regexp_like(pass,'[A-Z]') -- at least one UPPER letter
      ) pass_gen;
    

    正如您在此处看到的,我强制 nested loops 并禁用合并和取消嵌套转换。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-28
      • 2020-09-13
      • 2020-07-29
      • 2018-09-09
      • 1970-01-01
      • 1970-01-01
      • 2020-07-24
      相关资源
      最近更新 更多