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

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

所以就想在oracle自己写函数来实现,并且可以建立数据库表方便管理密码,数据做这些事情有天生的优势。

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

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

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

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 

如果不想用这哥们儿写的函数,也可以学习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;

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

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,转载请说明出处….

Oracle 生成随机密码的更多相关文章

  1. php生成随机密码(php自定义函数)转自先锋教程网

    php生成随机密码(php自定义函数) 时间:2015-12-16 20:43:49来源:网络 导读:php随机密码的生成代码,使用php自定义函数生成指定长度的随机密码,密码规则为小写字母与数字的随 ...

  2. Linux 命令行生成随机密码的十种方法

    Linux操作系统的一大优点是对于同样一件事情,你可以使用高达数百种方法来实现它.例如,你可以通过数十种方法来生成随机密码.本文将介绍生成随机密码的十种方法.这些方法均收集于Command-Line ...

  3. Oracle生成千万测试数据

    oracle 生成千万测试数据 做数据库开发或管理的人经常要创建大量的测试数据,动不动就需要上万条,如果一条一条的录入,那会浪费大量的时间,本文介绍了Oracle中如何通过一条SQL快速生成大量的测试 ...

  4. PHP生成随机密码的4种方法及性能对比

    PHP生成随机密码的4种方法及性能对比 http://www.php100.com/html/it/biancheng/2015/0422/8926.html 来源:露兜博客   时间:2015-04 ...

  5. oracle生成.net的guid方法;

    最近在做一个T1的.NET项目,数据库oracle的时候,遇到一个问题..NET里面的某个数据库表类的某个字段是guid类型.但是用oracle生成的guid.跟.NET的guid 无法识别.导致报错 ...

  6. linux生成随机密码

    通常情况下大家生成密码都好困惑,一来复杂程度不够会不安全,复杂程度够了又不能手动随便敲击键盘打出一同字符(但通常情况下这些字符是有规律的), 使用1password 或者 keepass 这种软件生成 ...

  7. Oracle 生成指定范围内随机日期

    Oracle生成一个指定范围内的随机日期 /* 年1月1日)的整数偏移量来保存(即把日期保存为一个数字); * 因此可通过寻找‘指定日期’与‘关键日期’相对应的整数偏移量,再加一个指定范围内的随机整数 ...

  8. Oracle生成查询包括对应于所有数据表记录语句中指定的字段名

    应用:已知的字段名,表中的所有数据的查询数据库中包含的所有数据表的字段名 操作方法:指定字段名,用户数据库表,它可以执行以下查询 --Oracle生成查询包括对应于所有数据表记录语句中指定的字段名 d ...

  9. 【转】PHP生成随机密码的几种方法

    使用PHP开发应用程序,尤其是网站程序,常常需要生成随机密码,如用户注册生成随机密码,用户重置密码也需要生成一个随机的密码.随机密码也就是一串固定长度的字符串,这里我收集整理了几种生成随机字符串的方法 ...

随机推荐

  1. SQLlite(WebSQL)如何排序并分页查询(SQLlite语法)

    SELECT * FROM Table ORDER BY ID DESC Limit 10,9 limit语义:跳过10行,取9行 参考: SQLite的limit用法   如果我要去11-20的Ac ...

  2. 获取本机外网IP的方式笔记

    1.IP138 网址:http://www.ip138.com/: 分离出的快速查询地址:http://20140507.ip138.com/ic.asp(2014年8月9日有效) 个人经验:百度搜索 ...

  3. private

    成员变量私有化的好处在于可以强制加强面向对象和封装的概念,一个面向对象的系统更加关注行为,而不是数据,所以应该通过发送消息来获得数据,也应该实习细节的封装

  4. CSS:不可思议的border属性

    原文:Magic of CSS border property 译文:不可思议的CSS border属性 译者:dwqs 在CSS中,其border属性有很多的规则.对于一些事物,例如三角形或者其它的 ...

  5. WinDriver&amp;PCIE

    1.安装VS2012 安装VS2012略过,主要用它来做数据传输应用程序的,WINDRIVER提供了一系列API接口,方便了用户,使用户能直接进入用户态的编程,因为内核态的编程它已做好,不需要进行修改 ...

  6. [Hive - LanguageManual] Hive Default Authorization - Legacy Mode

    Disclaimer Prerequisites Users, Groups, and Roles Names of Users and Roles Creating/Dropping/Using R ...

  7. uva202:循环小数(循环节+抽屉原理)

    题意: 给出两个数n,m,0<=n,m<=3000,输出n/m的循环小数表示以及循环节长度. 思路: 设立一个r[]数组记录循环小数,u[]记录每次的count,用于标记,小数计算可用 r ...

  8. HDU-4749 Parade Show KMP算法 | DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4749 题意:给两个串S和P,求S串中存在多少个与P串的大小关系一样的串. 因为数字的范围是1<= ...

  9. android 源码编译中的错误 解决

    1.编译种错误提示: arm-none-linux-gnueabi-gcc: directory: No such file or directory arm-none-linux-gnueabi-g ...

  10. homework-08

    这次作业是考察关于C++的一些使用,由于我的C++只掌握了基本功,所以我只有霸王硬上弓,勉强写写自己的浅见. 1. 理解C++变量的作用域和生命周期 对一个C++变量来说,有两个属性非常重要:作用域和 ...