MySQL 5.0 之后的版本开始支持存储过程,存储过程具备壹致性、高效性和安全性。MySQL 5.0 以前的版本并不支持存储过程,然而随着 MySQL 技术的日趋完善,存储过程将在之后的项目中获得普遍的应用。mysql
在个人应用中,我须要在用户首次注册时为该账号生成一个随机密码。所生成的密码必须知足必定的要求,这些要求由系统管理员进行配置。sql
咱们提供了下面几个对密码的要求规则,这些规则可组合使用:数据库
1- 要求大写字母 UPPERCASE =====> 缩写 [U]5- 必须有非字母和数字的字符 NON_ALPHANUMERIC_CHARACTER =====> 缩写 [S]安全
所以我想经过建立一个动态函数 "RANDOM_PASSWORD" 来根据要求返回随机的密码。函数
系统管理员只须要传递所需密码的规则就会返回对应的随机密码。spa
例如要求以下:命令行
首字符必须大写 ======> U所生成的密码程度跟传递的参数长度是一致的。在咱们这个例子中生成的密码长度是 6。调试
你可使用下面的方法来调用这个函数:code
RANDOM_PASSWORD('ULNASN')
在MySQL的控制台编写函数定义前,先要将数据库中可能已经存在的此函数定义删除,而后须将分隔符更改成$,其实我本想将分隔符改为#,后来发现没有成功,不知道是为何,在命令行下删除 RANDOM_PASSWORD() 函数的定义与更改分隔符使用以下命令:it
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
固然,你运行的结果可能不同,由于这是随机的。