登录与数据库用户的映射关系怎么理解
SQL Server 的登录(服务器级)与数据库用户(库级)两层身份模型:为什么连接了却「进不了库」、映射怎么做、一个登录映射多库的情况。
结论先行
SQL Server 是两层身份:服务器级的登录(Login)决定「能不能连上这台引擎」,库级的数据库用户(Database User)决定「进了某个库之后能干什么」。两层之间靠映射衔接。所以「连上了却查不了库/报无权限」的根因几乎都是:登录建了,但这个库里的用户没映射或没授权。
两层模型
| 层 | 对象 | 存哪 | 决定什么 |
|---|---|---|---|
| 服务器级 | 登录(SQL 登录或 Windows 登录) | master 库 | 能否连接到这台引擎 |
| 库级 | 数据库用户 | 各自的库 | 该库里的权限 |
一个登录要进 N 个库,就得在每个库里各映射一个用户。登录本身不携带库内权限,权限全在「用户 + 授权」上。
映射与授权(T-SQL)
-- 服务器级:建登录(master)
CREATE LOGIN AppSales WITH PASSWORD = N'强密码';
-- 库级:在 Sales 库里把该登录映射为库用户
USE Sales;
CREATE USER AppSales FOR LOGIN AppSales;
-- 授权
GRANT SELECT, INSERT ON dbo.Orders TO AppSales;
多库场景:每个用到的库都重复 USE 库; CREATE USER ...;。SSMS(SSMS 管理工具条目)对应:安全性 → 登录 → 某登录属性 → 映射页勾选目标库(可自动建同名用户)。
三类典型故障对应根因
| 现象 | 根因 | 解法 |
|---|---|---|
| 能连上、报「用户 X 映射到不存在的用户」 | 库里没映射该登录 | 建映射用户 |
| 能连上、能映射、但查表报无权限 | 用户没授权 | GRANT 对应 DML |
| 完全连不上 | 登录层就失败 | 登录不存在/密码错/被禁用 |
Windows 登录的特殊性
域账号/本机账号作为登录时,「映射」就是把该 Windows 身份关联到库用户;域组成员可映射组而不是逐个账号,成员变动不用改库(见域连接相关条目)。
SQL Server 2022 Developer、SQL Server 2019 Developer 条目环境下两层模型一致;建号最小权限的完整裁剪见「怎么建最小权限的应用数据库账户」相关条目,SQL Server 产品族条目 各引擎身份模型通用。