在SQL Server中使用CHECK控制密码属性



PD:有些名字是西班牙语的,对不起。

我有一个包含列UsuarioContraseña的表。

对于每一个,都需要确定:登录用户(在系统和标识中是唯一的(和访问密码(必须包含5个字母和2个数字,确切长度为7(。考虑登录名必须有正好10个字符的

创建的表格如下:

CREATE TABLE Empleado
(
Usuario varchar(10) NOT NULL UNIQUE 
CHECK(LEN([Usuario]) = 10),
Contraseña varchar(7) NOT NULL 
CHECK (LEN([Contraseña]) = (7) AND [Contraseña] LIKE '%[0-9]%' AND [Contraseña] LIKE '%[A-Z]%')
)

数据是这样插入的:

INSERT INTO Empleado (Usuario, Contraseña) 
VALUES ('santiago21', 'qwerty1')
INSERT INTO Empleado (Usuario, Contraseña) 
VALUES ('FaaacuuUwU', 'qwertY1')

问题是第二个插件应该接受它,但第一个插件不应该接受,这是它不做的

有人知道我该怎么做吗?非常感谢。

我们可以在这里利用SQL Server增强的LIKE运算符:

CREATE TABLE Empleado (
Usuario varchar(10) NOT NULL UNIQUE CHECK(LEN([Usuario]) = 10),
Contraseña varchar(7) NOT NULL CHECK (
LEN([Contraseña]) = 7 AND
[Contraseña] LIKE '%[0-9]%[0-9]%' AND                                -- 2 numbers
[Contraseña] LIKE '%[A-Za-z]%[A-Za-z]%[A-Za-z]%[A-Za-z]%[A-Za-z]%')  -- 5 letters
)
);

编辑:

通常,您应该而不是在数据库中存储明文密码。原因是,如果任何人(内部或外部(能够访问您的Empleado表,他们将能够访问整个系统中的每个凭据。

相反,更安全的方法是首先不可逆地散列每个密码,然后存储散列。然后,在不太可能的情况下,不受欢迎的人可能会访问你的表,他们不会得到密码,只是带有一些胡言乱语的密码散列的用户名,他们无法轻易地恢复到原始密码。

最新更新