博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
密码需要带特殊字符(二)
阅读量:6271 次
发布时间:2019-06-22

本文共 2130 字,大约阅读时间需要 7 分钟。

此篇博文是这篇的升级篇,前一篇的存储过程产生的密码随机数,有可能一个随机数就包含有过多的特殊字符,而且第一个字符就有可能是特殊字符。

因此产生此篇,随机密码首字符不能为数字与特殊字符但必须包含且只有一个特殊字符。

另外还修正了特殊字符集长度问题,使用特殊字符集长度减一(LEN(@SpecialCharacter) - 1) 这样当你增减特殊字符集时,再不需多次地方一同修改。

修正前:

SUBSTRING(
@SpecialCharacter
CONVERT(
TINYINT,
ROUND(
RAND() 
* 
6 
+ 
1,
0)),
1)

 

修正后:

SUBSTRING(
@SpecialCharacter
CONVERT(
TINYINT,
ROUND(
RAND() 
* (
LEN(
@SpecialCharacter
- 
1
+ 
1,
0)),
1)

 

完整的存储过程,仅供参考。

ExpandedBlockStart.gif
usp_RandomPassword
ALTER 
PROCEDURE 
[
dbo
].
[
usp_RandomPassword
] 
(
   
@Length 
INT 
= 
8
)
AS
BEGIN  
    
DECLARE 
@RandomPassword 
NVARCHAR(
MAX
= N
'' 
    
DECLARE 
@SpecialCharacter 
NVARCHAR(
255
= N
'
@#$%&*?
'  
--
特殊字符集
    
DECLARE 
@HasSpcCht 
BIT 
= 
0  
--
判断产生的随机数是否有包含随机数
    
DECLARE 
@L 
INT 
= 
1  
    
    
DECLARE 
@R 
TINYINT,
@R1 
TINYINT,
@R2 
TINYINT     
    
WHILE  
@L 
<= 
@Length 
--
循环密码长度,每一位字符将随机产生
    
BEGIN
        
IF 
@L 
= 
1 
--
随机数第一位只为字母,大写或小写
        
BEGIN
            
SET 
@R 
= 
ROUND(
RAND() 
* 
1
0)            
            
SET 
@RandomPassword 
= 
@RandomPassword 
+ 
CASE 
@R
            
WHEN 
0 
THEN 
CHAR(
ROUND(
RAND() 
* 
25 
+ 
97,
0))
            
WHEN 
1 
THEN 
CHAR(
ROUND(
RAND() 
* 
25 
+ 
65,
0))        
            
END                
        
END    
        
ELSE   
        
BEGIN            
            
IF 
@L 
= 
@Length 
AND 
@HasSpcCht 
= 
0  
--
当最后一位时,如果没有产生过特殊字符,那为随机数产生一个。
            
BEGIN
                
SET 
@RandomPassword 
= 
@RandomPassword 
+ 
SUBSTRING(
@SpecialCharacter
CONVERT(
TINYINT,
ROUND(
RAND() 
* (
LEN(
@SpecialCharacter
- 
1
+ 
1,
0)),
1)
                
SET 
@HasSpcCht 
= 
1
            
END
            
ELSE
            
BEGIN
                
SET 
@R1 
= 
ROUND(
RAND() 
* 
3
0
                
IF 
@R1 
= 
0
                    
SET 
@RandomPassword 
= 
@RandomPassword 
+ 
CHAR(
ROUND(
RAND() 
* 
25 
+ 
97,
0))
                    
                
IF 
@R1 
= 
1 
                    
SET 
@RandomPassword 
= 
@RandomPassword 
+ 
CHAR(
ROUND(
RAND() 
* 
25 
+ 
65,
0))
                    
                
IF 
@R1 
= 
2 
                    
SET 
@RandomPassword 
= 
@RandomPassword 
+ 
CHAR(
ROUND(
RAND() 
* 
9 
+ 
48,
0))    
                                
                
IF 
@R1 
= 
3  
--
随机产生特殊字符
                
BEGIN    
                    
IF 
@HasSpcCht 
= 
0  
--
如果没有产生过,那为随机数产生一个。
                    
BEGIN
                        
SET 
@RandomPassword 
= 
@RandomPassword 
+ 
SUBSTRING(
@SpecialCharacter
CONVERT(
TINYINT,
ROUND(
RAND() 
* (
LEN(
@SpecialCharacter
- 
1
+ 
1,
0)),
1)
                        
SET 
@HasSpcCht 
= 
1
                    
END                
                    
ELSE  
--
如果已经产生过特殊字符,只循环产生字母,或数字
                    
BEGIN  
                        
SET 
@R2 
= 
ROUND(
RAND() 
* 
2
0
                        
SET 
@RandomPassword 
= 
@RandomPassword 
+ 
CASE 
@R2
                        
WHEN 
0 
THEN 
CHAR(
ROUND(
RAND() 
* 
25 
+ 
97,
0))
                        
WHEN 
1 
THEN 
CHAR(
ROUND(
RAND() 
* 
25 
+ 
65,
0))    
                        
WHEN 
2 
THEN 
CHAR(
ROUND(
RAND() 
* 
9 
+ 
48,
0))    
                        
END    
                    
END                
                
END
            
END
        
END        
        
        
SET 
@L 
= 
@L 
+ 
1  
--
随机产生一位,随机数位数加一位。
    
END    
    
SELECT 
@RandomPassword
END

 

 

转载地址:http://bxlpa.baihongyu.com/

你可能感兴趣的文章
C++ - 判断文件夹(folder)是否存在(exist)
查看>>
小程序-修改多级数据
查看>>
不管10天20天这都是个悲剧何必呢
查看>>
建立简单的FTP服务器
查看>>
OWA登录页面显示为英文而不是中文
查看>>
711B - 人性的弱点
查看>>
PHP使用Memached实现Session储存
查看>>
IDEA debug调试技巧
查看>>
非常好的Python学习资源收集整理
查看>>
java 图片等比压缩
查看>>
Oracle 创建普通用户,并赋予权限
查看>>
我的友情链接
查看>>
android工程目录结构,及相关文件获取方式(1)
查看>>
Vsftpd内网映射相关原理及配置
查看>>
Linux非对称路由
查看>>
在iOS 8中使用UIAlertController
查看>>
第2课:通过案例对SparkStreaming 透彻理解三板斧之二:解密SparkStreaming运行机制和架构...
查看>>
IOS开发—App 在 IOS 8 的simulator运行时,定位卡死bug解决
查看>>
windows 密钥登陆 linux
查看>>
IOS 录制视频
查看>>