首页 > 解决方案 > 在 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

解决方案


我们可以在这里利用 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表,他们将可以访问您整个系统中的每个凭据。

相反,一种更安全的方法是首先对每个密码进行不可逆的散列,然后存储散列。然后,万一不受欢迎的人可能获得访问您的表的权限,他们将不会获得密码,只会获得带有一些乱码密码哈希的用户名,他们无法轻易地退回到原始密码。


推荐阅读