Oracle中密码的正则表达式,至少包含两个大写字母和两个小写字母



在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 NULLCHECK约束,如下所示:

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值。

最新更新