sql-server - 在 SQL Server 中使用 CHECK 控制密码属性
问题描述
PD:有些名字是西班牙语,抱歉。
我有一个包含列Usuario
和Contraseñ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
表,他们将可以访问您整个系统中的每个凭据。
相反,一种更安全的方法是首先对每个密码进行不可逆的散列,然后存储散列。然后,万一不受欢迎的人可能获得访问您的表的权限,他们将不会获得密码,只会获得带有一些乱码密码哈希的用户名,他们无法轻易地退回到原始密码。
推荐阅读
- python - 如何在无序列表 selenium + python 中抓取信息
- typescript - Typescript - 输出类型取决于输入类型
- android-room - 无法弄清楚如何使用 pojo 从一个 Room 实体构造 ViewPager2 的数据
- arrays - 索引匹配不同日期和值之间的搜索
- webrtc - 无法访问 coturn 网络管理员
- json - 如何从一个数据框中获取规则并将其应用于其他数据框以获取 python 中的统计信息?
- scheme - SICP Ex。1.17 - “快速乘法”比“乘法”慢?
- c# - 为什么我不能通过反射获得控件的 MouseDown 事件
- python-3.x - 无法在 Windows 7 中从 cmd 启动 Jupyter lab
- c++ - 插入并填充全局数组 LLVM