0

我希望对表“管理员”中的密码字段进行约束。我想要的约束是密码不应少于 6 个字符,并且应包含混合字符(数字 + 数字)。

此约束的 KEYWORD 是什么,语法是什么。我已经 Googledit 有一段时间了,我在办公室,我必须尽快完成这项任务。我正在使用 MS SQL

这是我写的,

CREATE TABLE Administrators
(
 Id int NOT NULL IDENTITY(1,1) PRIMARY KEY,
 UserName varchar(255) NOT NULL,
 PassWord varchar(255) NOT NULL,
 Email varchar(255) NOT NULL
);
4

2 回答 2

1

您可以对表设置检查约束,并且可以将验证逻辑封装在 UDF 中。这样您就可以随时更改逻辑。

    CREATE TABLE CheckTbl (col1 varchar(20), col2 varchar(20));

    CREATE FUNCTION CheckPassword(@pass varchar(20))
    RETURNS int
    AS 
    BEGIN
       DECLARE @retval int

        if len(@pass)>6 and PATINDEX('%[0-9]%', @pass) >0 and PATINDEX('%[a-zA-Z]%', @pass) >0
        SET @retval = 1
        else
        SET @retval = 0

       RETURN @retval
    END;

ALTER TABLE CheckTbl
ADD CONSTRAINT CheckPasswordRules CHECK (dbo.CheckPassword(col1) >= 1 );

SQL小提琴

测试用例

insert into CheckTbl (col1, col2) values('as33dasd', '') --success
insert into CheckTbl (col1, col2) values('33sdasd', '') --success
insert into CheckTbl (col1, col2) values('sdasd22', '') --success
insert into CheckTbl (col1, col2) values('33dasd', '') --fail requires length >6
于 2014-02-27T13:58:12.920 回答
1

如果您绝对必须在 DB 层进行此验证并且不关心您的密码被存储为纯文本,请使用TRIGGER. 它将让您最大程度地控制如何接受或拒绝密码。您也可以使用 Shantanu Gupta 的策略。同样,仅当您不介意以纯文本形式存储的密码时。

现在,恕我直言正确做法是让您在应用程序的业务逻辑层中进行此验证,并将密码存储为哈希。

但是由于您在评论中提到您不希望学习触发器如何工作或将您的应用程序拆分为逻辑层的负担,因此您始终可以在客户端上进行验证。这是非常错误的,但是如果您不愿意学习正确的做事方式,并且您可以轻松地向您的客户销售廉价制造的应用程序,那么它可能是您正在寻找的替代方案。

于 2014-02-27T13:26:35.113 回答