需求:須要按期更改密碼。要求是一、密碼位數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,轉載請說明出處….