Sql Oracle中至少包含两个大写和两个小写字母的密码正则表达式
我在oracle 18 xe中对数据库执行约束时遇到问题 我需要的是密码已被修改Sql Oracle中至少包含两个大写和两个小写字母的密码正则表达式,sql,oracle,oracle18c,oracle-xe-18.4,Sql,Oracle,Oracle18c,Oracle Xe 18.4,我在oracle 18 xe中对数据库执行约束时遇到问题 我需要的是密码已被修改 至少5个字符 至少两个大写字母 至少两个小写字母 至少一位数字 我已经做了足够多的搜索,但找不到正确的方法,到目前为止我穿这个 ALTER TABLE USER ADD CONSTRAINT PASSWORD_CHECK REGEXP_LIKE(PASSWORD, '^.*[0-9]', 'c') AND REGEXP_LIKE(PASSWORD, '^.*[A-Z]{2,}', 'c'); AND REG
- 至少5个字符
- 至少两个大写字母
- 至少两个小写字母
- 至少一位数字
ALTER TABLE USER
ADD CONSTRAINT PASSWORD_CHECK
REGEXP_LIKE(PASSWORD, '^.*[0-9]', 'c')
AND REGEXP_LIKE(PASSWORD, '^.*[A-Z]{2,}', 'c');
AND REGEXP_LIKE(PASSWORD, '^.*[a-z]{2,}', 'c');
AND REGEXP_LIKE(PASSWORD, '^[a-zA-Z0-9]{5,}$', 'c');
谢谢你的支持 唉,如果Oracle的正则表达式引擎支持lookaheads,那么您可以只使用一种模式:
^(?=.*[A-Z].*[A-Z])(?=.*[a-z].*[a-z])(?=.*[0-9]).{5,}$
但是,它不支持lookarounds,所以我们基本上坚持您当前的方法。您当前的模式有一些小问题,而且类似于的可以与部分匹配一起工作,因此在大多数情况下不需要^和$锚定。考虑这个版本:
altertable用户
添加约束密码检查
类REGEXP_(密码,[0-9],'c')--1+位
和REGEXP_LIKE(密码,[A-Z].[A-Z]','c');--2+鞋面
和REGEXP_LIKE(密码,[a-z].[a-z]','c');--2+降低
和REGEXP_LIKE(密码,^[a-zA-Z0-9]{5,}$,'c');--长度>=5
如果您没有密码只能是数字和字母的限制,则可以将最终条件替换为以下内容:
LENGTH(PASSWORD) >= 5
您可以使用
PASSWORD
列上的notnull
和CHECK
约束,如下所示:
CREATE TABLE USERS (PASSWORD VARCHAR2(10) NOT NULL); -- NOT NULL
ALTER TABLE USERS ADD CONSTRAINT PASSWORD_CHECK
CHECK (REGEXP_COUNT(PASSWORD, '[0-9]') >= 1 -- 1 digit
AND REGEXP_COUNT(PASSWORD, '[A-Z]') >= 2 -- 2 or more uppercase characters
AND REGEXP_COUNT(PASSWORD, '[a-z]') >= 2 -- 2 or more lowercase characters
AND LENGTH(PASSWORD) >= 5); -- minimum length must be 5
非空
密码列上的约束将是必需的,因为检查
约束将不会应用于空
值,如果未创建列上的非空
约束,它将允许插入空
值。如果您这样做是为了学习使用ReXEP在数据库中,这是好的,但是代替存储密码或将它们发送到数据库中,请考虑在UI中散列密码,并且仅通过网络发送散列值来存储在数据库中,在用户输入上应用验证规则。这就是人们被黑客攻击的方式。即使你的问题只是为了一个作业,你也需要知道这是一个可怕的、不道德的编码实践。至少,使用像STANDARD_HASH
这样的东西来代替明文。