我希望对我的“管理员”表中的密码字段设置一个约束。我想要的约束是密码不应少于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
);
答案 0 :(得分:1)
如果您绝对必须在数据库图层上进行此验证,并且不在乎将密码存储为纯文本,请使用TRIGGER
。它将使您可以最大限度地控制密码的接受或拒绝方式。您也可以使用Shantanu Gupta的策略。同样,只有当您不介意以纯文本形式存储密码时。
现在, 正确的要做的事情恕我直言,您可以在应用程序的业务逻辑层中进行此验证,并将密码存储为哈希值。< / p>
但是,由于您在评论中提到您不希望学习触发器如何工作的负担或将您的应用分成逻辑层,因此您始终可以在客户端上进行验证。这是非常错误但是如果你不愿意学习正确的做事方式而且你可以放心地向客户出售廉价的应用程序,那么它可能是你的另类选择。寻找。
答案 1 :(得分: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 );
测试用例
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