日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Oracle 生成随机密码

發(fā)布時(shí)間:2024/1/17 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Oracle 生成随机密码 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

需求:需要定期更改密碼。要求是1、密碼位數(shù)11位。2、必須包含大小寫字母、數(shù)字、特殊字符。3、排除一些特殊字符如()、@、&

oracle數(shù)據(jù)庫(kù)中有可已生成隨機(jī)密碼包dbms_random,但是用起來(lái)有點(diǎn)兒不方便,滿足不了上面的需求。一些網(wǎng)頁(yè)工具或者小軟件,使用起來(lái)也不方便。

所以就想在oracle自己寫函數(shù)來(lái)實(shí)現(xiàn),并且可以建立數(shù)據(jù)庫(kù)表方便管理密碼,數(shù)據(jù)做這些事情有天生的優(yōu)勢(shì)。

第一步:在數(shù)據(jù)庫(kù)中創(chuàng)建用來(lái)管理密碼的表。

舉例:生成Linux中oracle、grid用戶隨機(jī)密碼

CREATE TABLE HOST_TAB (HOSTID NUMBER, HOSTNAME VARCHAR2(100), DESCRIPTION VARCHAR2(2000)); --創(chuàng)建業(yè)務(wù)系統(tǒng)列表

CREATE TABLE PASSWORD_TAB (HOSTID NUMBER,ORACLE_PASSWORD VARCHAR2(100),GRID_PASSWORD VARCHAR2(100),SHELL_TEXT VARCHAR2(100),CHANGE_DATE DATE) ;--創(chuàng)建密碼維護(hù)表

第二步:創(chuàng)建可以隨機(jī)生成密碼的函數(shù)。

隨便googel了一把,原來(lái)有國(guó)外的哥們兒自己寫函數(shù)實(shí)現(xiàn)了,膜拜下… 原文地址如下:同時(shí),希望copy的網(wǎng)友轉(zhuǎn)載博客時(shí)說(shuō)明出處

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

如果不想用這哥們兒寫的函數(shù),也可以學(xué)習(xí)oracle數(shù)據(jù)庫(kù)dbms_random.string函數(shù),學(xué)習(xí)并修改代碼如下:不得不說(shuō)oracle很值得我們學(xué)習(xí)

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;

第三步:使用存儲(chǔ)過(guò)程來(lái)實(shí)現(xiàn)。并且創(chuàng)建數(shù)據(jù)庫(kù)調(diào)度任務(wù)定期修改密碼。

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用戶下執(zhí)行shell_text中的命令。

也可以通過(guò)oracle 的dbms scheduler job 和 crontab來(lái)自動(dòng)實(shí)現(xiàn)。

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

允許copy,轉(zhuǎn)載請(qǐng)說(shuō)明出處….

轉(zhuǎn)載于:https://www.cnblogs.com/AlbertCQY/p/3267747.html

總結(jié)

以上是生活随笔為你收集整理的Oracle 生成随机密码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。