在Oracle18xe、中为数据库执行约束时遇到问题
我需要的是密码有
- 至少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的正则表达式引擎支持lookahead,那么您可以只使用一种模式:
^(?=.*[A-Z].*[A-Z])(?=.*[a-z].*[a-z])(?=.*[0-9]).{5,}$
然而,它不支持环视,所以我们几乎坚持您当前的方法。您当前的模式有一些小问题,而且REGEXP_LIKE
可以使用部分匹配,因此在大多数情况下不需要^
和$
锚点。考虑这个版本:
ALTER TABLE USER
ADD CONSTRAINT PASSWORD_CHECK
REGEXP_LIKE(PASSWORD, '[0-9]', 'c') -- 1+ digits
AND REGEXP_LIKE(PASSWORD, '[A-Z].*[A-Z]', 'c'); -- 2+ uppers
AND REGEXP_LIKE(PASSWORD, '[a-z].*[a-z]', 'c'); -- 2+ lowers
AND REGEXP_LIKE(PASSWORD, '^[a-zA-Z0-9]{5,}$', 'c'); -- length >= 5
如果你没有密码只能是数字和字母的限制,那么你可以用以下条件代替最终条件:
LENGTH(PASSWORD) >= 5
您可以在PASSWORD
列上使用NOT NULL
和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
PASSWORD
列上的NOT NULL
约束将是必需的,因为CHECK
约束将不应用于NULL
值,并且如果未创建该列的NOT NULL
约束,则允许插入NULL
值。