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
第四个字符随意 ======>A
第五个字符必须是非字母和数字 ======>S
第六个字符必须是数字 ======> N
那么你可以使用
"ULNASN" 参数来获取随机密码。
所生成的密码程度跟传递的参数长度是一致的。在我们这个例子中生成的密码长度是 6。你可以使用下面的方法来调用这个函数:RANDOM_PASSWORD("ULNASN")在MySQL的控制台编写函数定义前,先要将数据库中可能已经存在的此函数定义删除,然后须将分隔符更改为$,其实我本想将分隔符改成#,后来发现没有成功,不知道是为什么,在命令行下删除 RANDOM_PASSWORD() 函数的定义与更改分隔符使用如下命令:mysql> DROP FUNCTION IF EXISTS RANDOM_PASSWORD;
mysql> delimiter $接下来可以编写该函数,经过我调试通过的源代码如下:CREATE FUNCTION RANDOM_PASSWORD (str VARCHAR(255))
RETURNS VARCHAR(255)
BEGIN
DECLARE UPPER_CASE VARCHAR(26) DEFAULT "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
DECLARE LOWER_CASE VARCHAR(26) DEFAULT "abcdefghijklmnopqrstuvwxyz";
DECLARE NUMBERS VARCHAR(10) DEFAULT "0123456789";
DECLARE TEMP_CHARACTER VARCHAR(255) DEFAULT "";
DECLARE NON_ALPHANUMERIC_CHARACTERS VARCHAR(255) DEFAULT ,.?/"">"~!@#$%^&*()_+-=`:;<>,.?/";
DECLARE ALL_STRING VARCHAR(255) DEFAULT ,.?/"">"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789~!@#$%^&*()_+-=`:;<>,.?/";
DECLARE STR_LENGTH INT DEFAULT 0;
DECLARE i INT DEFAULT 0;
DECLARE RANDOM_CHARACTER CHAR(1) DEFAULT " ";
DECLARE PASSWORD_RETURNED VARCHAR(255) DEFAULT "";
SET STR_LENGTH = CHAR_LENGTH(str);
WHILE i < STR_LENGTH DO
SET TEMP_CHARACTER = SUBSTR(str, i + 1, 1);
CASE TEMP_CHARACTER
WHEN "N" THEN
SET RANDOM_CHARACTER = SUBSTR(NUMBERS, CEIL( RAND() * ( LENGTH( NUMBERS ) - 1 )), 1);
WHEN "U" THEN
SET RANDOM_CHARACTER = SUBSTR(UPPER_CASE, CEIL( RAND() * ( LENGTH( UPPER_CASE ) - 1 )), 1);
WHEN "L" THEN
SET RANDOM_CHARACTER = SUBSTR(LOWER_CASE, CEIL( RAND() * ( LENGTH( LOWER_CASE ) - 1 )), 1);
WHEN "S" THEN
SET RANDOM_CHARACTER = SUBSTR(NON_ALPHANUMERIC_CHARACTERS, CEIL( RAND() * ( LENGTH( NON_ALPHANUMERIC_CHARACTERS ) - 1 )), 1);
WHEN "A" THEN
SET RANDOM_CHARACTER = SUBSTR(ALL_STRING, CEIL( RAND() * ( LENGTH( ALL_STRING ) - 1 )), 1);
ELSE
SET RANDOM_CHARACTER = "";
END CASE;
SET PASSWORD_RETURNED = CONCAT(PASSWORD_RETURNED, RANDOM_CHARACTER);
SET i = i + 1;
END WHILE;
RETURN PASSWORD_RETURNED;
END
$使用方法:mysql> select RANDOM_PASSWORD("ULNASN") PASSWORD;
+----------+
| PASSWORD |
+----------+
| Bv1n`8 |
+----------+
1 row in set (0.00 sec)在我这里将返回的随机密码是:Bv1n`8当然,你运行的结果可能不一样,因为这是随机的。在 Oracle 中生成随机密码图解MySQL学习及思考相关资讯 MySQL数据库教程
- MySQL 处理非法数据 (04/09/2013 08:06:28)
- MySQL关于timestamp和mysqldump的 (12/16/2012 13:25:41)
- MySQL保证数据完整性 (12/16/2012 12:00:35)
| - ERROR 1130: mysql 1130连接错误的 (12/16/2012 13:29:08)
- MySQL数据库教程:管理数据库和表( (12/16/2012 12:47:02)
- MySQL快速插入大批量数据存储过程 (11/05/2012 19:04:04)
|
本文评论 查看全部评论 (0)