MySQL 5.0 以後的版本開始支援預存程序,預存程序具有壹致性、高效性和安全性。MySQL 5.0 之前的版本並不支援預存程序,然而隨著 MySQL 技術的日趨完善,預存程序將在以後的專案中得到廣泛的應用。
在我的應用中,我需要在使用者首次註冊時為該帳號生成一個隨機密碼。所生成的密碼必須滿足一定的要求,這些要求由系統管理員進行配置。
我們提供了下面幾個對密碼的要求規則,這些規則可組合使用:
1- 要求大寫字母 UPPERCASE =====> 縮寫 [U]
2- 要求小寫字母 LOWERCASE =====> 縮寫 [L]
3- 要求使用數位 NUMBER =====> 縮寫 [N]
4- 可以是任一字元 ANY_CHARACTER ======> 縮寫 [A]
5- 必須有非字母和數位的字元 NON_ALPHANUMERIC_CHARACTER =====> 縮寫 [S]
因此我想通過創建一個動態函數 "RANDOM_PASSWORD" 來根據要求返回隨機的密碼。
系統管理員只需要傳遞所需密碼的規則就會返回對應的隨機密碼。
例如要求如下:
首字元必須大寫 ======> U
第二個字元必須小寫 ======> L
第三個字元必須是數位 ======>N
第四個字元隨意www.it165.net ======>A
第五個字元必須是非字母和數位 ======>S
第六個字元必須是數位 ======> N
那麼你可以使用 "ULNASN" 參數來獲取隨機密碼。
所生成的密碼程度跟傳遞的參數長度是一致的。在我們這個例子中生成的密碼長度是 6。
你可以使用下面的方法來調用這個函數:
RANDOM_PASSWORD('ULNASN')
在MySQL的主控台編寫函式定義前,先要將資料庫中可能已經存在的此函式定義刪除,然後須將分隔符號更改為$,其實我本想將分隔符號改成#,後來發現沒有成功,不知道是為什麼,在命令列下刪除 RANDOM_PASSWORD() 函數的定義與更改分隔符號使用如下命令:
CREATE
FUNCTION
RANDOM_PASSWORD (str
VARCHAR
(255))
02.
RETURNS
VARCHAR
(255)
03.
BEGIN
04.
DECLARE
UPPER_CASE
VARCHAR
(26)
DEFAULT
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
;
05.
DECLARE
LOWER_CASE
VARCHAR
(26)
DEFAULT
'abcdefghijklmnopqrstuvwxyz'
;
06.
DECLARE
NUMBERS
VARCHAR
(10)
DEFAULT
'0123456789'
;
07.
DECLARE
TEMP_CHARACTER
VARCHAR
(255)
DEFAULT
''
;
08.
DECLARE
NON_ALPHANUMERIC_CHARACTERS
VARCHAR
(255)
DEFAULT
'~!@#$%^&*()_+-=`:;<>,.?/'
;
09.
DECLARE
ALL_STRING
VARCHAR
(255)
DEFAULT
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789~!@#$%^&*()_+-=`:;<>,.?/'
;
10.
DECLARE
STR_LENGTH
INT
DEFAULT
0;
11.
DECLARE
i
INT
DEFAULT
0;
12.
DECLARE
RANDOM_CHARACTER
CHAR
(1)
DEFAULT
' '
;
13.
DECLARE
PASSWORD_RETURNED
VARCHAR
(255)
DEFAULT
''
;
14.
15.
SET
STR_LENGTH = CHAR_LENGTH(str);
16.
17.
WHILE i < STR_LENGTH DO
18.
SET
TEMP_CHARACTER = SUBSTR(str, i + 1, 1);
19.
CASE
TEMP_CHARACTER
20.
WHEN
'N'
THEN
21.
SET
RANDOM_CHARACTER = SUBSTR(NUMBERS, CEIL( RAND() * ( LENGTH( NUMBERS ) - 1 )), 1);
22.
WHEN
'U'
THEN
23.
SET
RANDOM_CHARACTER = SUBSTR(UPPER_CASE, CEIL( RAND() * ( LENGTH( UPPER_CASE ) - 1 )), 1);
24.
WHEN
'L'
THEN
25.
SET
RANDOM_CHARACTER = SUBSTR(LOWER_CASE, CEIL( RAND() * ( LENGTH( LOWER_CASE ) - 1 )), 1);
26.
WHEN
'S'
THEN
27.
SET
RANDOM_CHARACTER = SUBSTR(NON_ALPHANUMERIC_CHARACTERS, CEIL( RAND() * ( LENGTH( NON_ALPHANUMERIC_CHARACTERS ) - 1 )), 1);
28.
WHEN
'A'
THEN
29.
SET
RANDOM_CHARACTER = SUBSTR(ALL_STRING, CEIL( RAND() * ( LENGTH( ALL_STRING ) - 1 )), 1);
30.
ELSE
31.
SET
RANDOM_CHARACTER =
''
;
32.
END
CASE
;
33.
SET
PASSWORD_RETURNED = CONCAT(PASSWORD_RETURNED, RANDOM_CHARACTER);
34.
SET
i = i + 1;
35.
END
WHILE;
36.
37.
RETURN
PASSWORD_RETURNED;
38.
END
39.
$
使用方法:
mysql> select RANDOM_PASSWORD('ULNASN') PASSWORD;
+----------+
| PASSWORD |
+----------+
| Bv1n`8 |
+----------+
1 row in set (0.00 sec)
在我這裡將返回的隨機密碼是:Bv1n`8
當然,你運行的結果可能不一樣,因為這是隨機的。
留言列表