Oracle 生成随机密码

需求:须要按期更改密码。要求是一、密码位数11位。二、必须包含大小写字母、数字、特殊字符。三、排除一些特殊字符如()、@、&html

oracle数据库中有可已生成随机密码包dbms_random,可是用起来有点儿不方便,知足不了上面的需求。一些网页工具或者小软件,使用起来也不方便。shell

因此就想在oracle本身写函数来实现,而且能够创建数据库表方便管理密码,数据作这些事情有天生的优点。数据库

第一步:在数据库中建立用来管理密码的表。

举例:生成Linux中oracle、grid用户随机密码oracle

CREATE TABLE HOST_TAB (HOSTID NUMBER, HOSTNAME VARCHAR2(100), DESCRIPTION VARCHAR2(2000)); --建立业务系统列表dom

CREATE TABLE PASSWORD_TAB (HOSTID NUMBER,ORACLE_PASSWORD VARCHAR2(100),GRID_PASSWORD VARCHAR2(100),SHELL_TEXT VARCHAR2(100),CHANGE_DATE DATE) ;--建立密码维护表函数

第二步:建立能够随机生成密码的函数。

随便googel了一把,原来有国外的哥们儿本身写函数实现了,膜拜下… 原文地址以下:同时,但愿copy的网友转载博客时说明出处工具

http://mahmoudoracle.blogspot.tw/2012/08/generate-random-password-in-oracle.html oop

若是不想用这哥们儿写的函数,也能够学习oracle数据库dbms_random.string函数,学习并修改代码以下:不得不说oracle很值得咱们学习学习

CREATE OR REPLACE FUNCTION random_password(password_num in varchar2)
  RETURN VARCHAR2
  PARALLEL_ENABLE is
  optx char(1);
  rng  NUMBER;
  n    BINARY_INTEGER;
  ccs  VARCHAR2(128); -- candidate character subset
  xstr VARCHAR2(4000);
BEGIN
  FOR i IN 1 .. length(password_num) LOOP
    /* Get random integer within specified range */
    n := TRUNC(rng * dbms_random.value) + 1;
    /* Append character to random_password2  */
    xstr := xstr || SUBSTR(ccs, n, 1);
    optx := SUBSTR(password_num, I, 1);
    IF optx = 'u' THEN
      -- upper case alpha characters only
      ccs := 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
      rng := 26;
    ELSIF optx = 'l' THEN
      -- lower case alpha characters only
      ccs := 'abcdefghijklmnopqrstuvwxyz';
      rng := 26;
    ELSIF optx = 'a' THEN
      -- alpha characters only (mixed case)
      ccs := 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' || 'abcdefghijklmnopqrstuvwxyz';
      rng := 52;
    ELSIF optx = 'n' THEN
      -- any numeric characters (upper)
      ccs := '0123456789';
      rng := 10;
    ELSIF optx = 'x' THEN
      -- any special characters (upper)
      ccs := ' !"#$%&()*+,-./:;<=>?@';
      rng := 23;
    ELSIF optx = 'p' THEN
      -- any printable char (ASCII subset)
      ccs := ' !"#$%&''()*+,-./' || '0123456789' || ':;<=>?@' ||
             'ABCDEFGHIJKLMNOPQRSTUVWXYZ' || '[\]^_`' ||
             'abcdefghijklmnopqrstuvwxyz' || '{|}~';
      rng := 95;
    ELSE
      ccs := 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
      rng := 26; -- default to upper case
    END IF;
 
  END LOOP;
  RETURN xstr;
END random_password;
htm

第三步:使用存储过程来实现。而且建立数据库调度任务按期修改密码。

create or replace procedure change_passwords(host_name varchar2) as

  cursor v_cur is
    select t1.hostid from host_tab t1 where t1.hostname = lower(host_name);
begin
  for v_i in v_cur loop
    begin
      insert into password_tab
        (hostid, oracle_password, grid_password, shell_text, change_date)
      values
        (v_i.hostid,
         '',
         '',
         'echo oracle:' || RANDOM_PASSWORD(‘ulaxpnlaxpnl’) ||
         '|chpasswd && echo grid:' || RANDOM_PASSWORD('ulaxpnlaxpnl') ||
         '|chpasswd',
         sysdate);
      commit;
    end;
  end loop;
  update password_tab t
     set t.oracle_password = substr(t.shell_text, 13, 11),
         t.grid_password   = substr(t.shell_text, 47, 11);
  commit;
end;

使用:

execute change_passwords(hostname=>’test’); test 为host_tab 表中hostname。

select t2.hostname,
       t2.description,
       t1.oracle_password,
       t1.grid_password,
       t1.shell_text,
       t1.change_date
  from password_tab t1
  left join host_tab t2
    on t1.hostid = t2.hostid;

最后在root用户下执行shell_text中的命令。

也能够经过oracle 的dbms scheduler job 和 crontab来自动实现。

-------------------------------------------------------------------------------------------------

容许copy,转载请说明出处….

相关文章
相关标签/搜索