我希望对我的表"管理员"中的密码字段进行约束。我想要的约束是密码不应少于 6 个字符,并且应包含混合字符(数字 + 数字)。
这个约束的关键字是什么,语法是什么。我已经谷歌了一段时间,我在我的办公室,我必须尽快完成这项任务。我正在使用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
);
您可以在表上有一个检查约束,并且可以将验证逻辑封装在 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
如果您绝对必须在数据库层上进行此验证,并且不在乎密码是否存储为纯文本,请使用 TRIGGER
.它将使您能够最大程度地控制如何接受或拒绝密码。你也可以使用Shantanu Gupta的策略。同样,仅当您不介意以纯文本形式存储的密码时。
我直言,正确的做法是在应用程序的业务逻辑层中进行此验证,并将密码存储为哈希。
但是,由于您在评论中提到您不希望学习触发器如何工作或将应用拆分为逻辑层,因此您始终可以在客户端上进行验证。这是非常错误的,但如果你不愿意学习正确的做事方式,并且你可以轻松地向客户出售廉价的应用程序,那么它可能是你正在寻找的替代方案。