与前一个密码有 3 个不同字符的密码 - PL/SQL
Posted
技术标签:
【中文标题】与前一个密码有 3 个不同字符的密码 - PL/SQL【英文标题】:Password with 3 different characters from the previous password - PL/SQL 【发布时间】:2019-11-27 22:17:13 【问题描述】:所以我的任务包括一个与 PL/SQL 中的前一个密码不同的 3 个字符的密码。 代码如下:
IF old_password IS NOT NULL THEN
differ := length(old_password) - length(password);
differ := abs(differ);
IF length(password) < length(old_password) THEN
m := length(password);
ELSE
m := length(old_password);
END IF;
FOR i IN 1..m LOOP
IF substr(password,i,1) != substr(old_password,i,1) THEN
differ := differ + 1;
END IF;
END LOOP;
IF differ < 3 THEN
raise_application_error(-20011, 'Password should differ from the \
old password by at least 3 characters');
END IF;
END IF;
-- Everything is fine; return TRUE ;
RETURN(TRUE);
如果我的旧密码是“aaa”,而我将其更改为“aaa222”,则会出现错误。没关系。
但是如果我的旧密码是“aaa”并且我将其更改为“aaa2222”,它不会给我一个错误,我不知道为什么。这应该给我一个错误..
怎么了?有什么解决办法吗?
【问题讨论】:
aa1a
与 aaa2
怎么样?它应该返回什么以及为什么?
当我使用“aaa”作为旧密码和“aaa222”作为新密码运行您的代码时,它成功完成(即没有错误)。 ??? db<>fiddle here
它应该返回一个错误,因为它必须与以前的密码有 3 个不同的字符。在这种情况下,只有“2”不同。但是这段代码有问题,因为它成功完成了
您首先检查长度是否不同。使用'aaa'
作为旧密码,'aaa222'
作为新密码。长度差为 3,因此您永远不会进入以IF differ < 3 THEN
开头的块。也许您想要做的是创建每个密码中唯一字符的集合,然后进行比较。
我消除了“IF different
【参考方案1】:
从您发布的代码来看,您的结果没有意义,我认为您发布的代码中有错字(请参阅下面的我的 cmets),但让我们分析一下代码实际在做什么。
明显
IF old_password IS NOT NULL THEN
在第一种情况下,这两行将差异设置为 3,将第二种情况设置为 4,因为字符串的长度不同
differ := length(old_password) - length(password);
differ := abs(differ);
此块在任何一种情况下都会选择两个密码中较短的一个,因此在两种情况下都会返回 3(aaa 的初始密码)
IF length(password) < length(old_password) THEN
m := length(password);
ELSE
m := length(old_password);
END IF;
您遍历短密码的长度,并将其与长密码逐个字符进行比较,前三个字符都是 aaa,因此匹配,这样您就不会进入 if 语句
FOR i IN 1..m LOOP
IF substr(password,i,1) != substr(old_password,i,1) THEN
differ := differ + 1;
END IF;
END LOOP;
在您的第一种情况下,差异将是 3,而在您的第二种情况下,则为 4,因此除非您有
IF differ < 3 THEN
raise_application_error(-20011, 'Password should differ from the \
old password by at least 3 characters');
END IF;
END IF;
在两种情况下都返回 true。
-- Everything is fine; return TRUE ;
RETURN(TRUE);
【讨论】:
以上是关于与前一个密码有 3 个不同字符的密码 - PL/SQL的主要内容,如果未能解决你的问题,请参考以下文章