0

在 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 REGEXP_LIKE(PASSWORD, '^.*[a-z]{2,}', 'c');
AND REGEXP_LIKE(PASSWORD, '^[a-zA-Z0-9]{5,}$', 'c');

谢谢你的支持!

4

2 回答 2

1

唉,如果 Oracle 的正则表达式引擎支持前瞻,你可以只使用一个模式:

^(?=.*[A-Z].*[A-Z])(?=.*[a-z].*[a-z])(?=.*[0-9]).{5,}$

但是,它不支持环视,因此我们几乎坚持使用您当前的方法。您当前的模式有一些小问题,也可以与部分匹配一起使用,因此在大多数情况下REGEXP_LIKE不需要^and锚点。$考虑这个版本:

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
于 2020-11-06T06:52:44.550 回答
-1

您可以在列上使用NOT NULLandCHECK约束,PASSWORD如下所示:

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

NOT NULL列上的约束PASSWORD将是必需的,因为该CHECK约束不会应用于值,并且如果未创建列上的约束,NULL它将允许插入NULL值。NOT NULL

于 2020-11-06T07:29:01.510 回答