怎么建最小权限的应用数据库账户
为应用创建最小权限数据库账号的完整流程:建 SQL 登录、映射到库用户、只授单表 DML 权限,以及「够用就好」的裁剪原则。
结论先行
应用账号的正确形态是:一个专门的 SQL 登录 + 每个用到的库一个映射用户 + 只对需要的表授 DML 权限,绝不复用 sa、绝不给 db_owner。原则一句话:够这个应用干活的最小集合,多一样都不给。
建号四步(T-SQL)
-- 1. 服务器级登录(应用专用)
CREATE LOGIN AppSales WITH PASSWORD = N'强密码', CHECK_POLICY = ON;
-- 2. 在每个用到的库里建映射用户
USE Sales;
CREATE USER AppSales FOR LOGIN AppSales;
-- 3. 只授要用的对象权限(示例:一张表读写)
GRANT SELECT, INSERT, UPDATE ON dbo.Orders TO AppSales;
-- 4. 需要走存储过程时,授执行权而不是表权
GRANT EXECUTE ON dbo.sp_CloseOrder TO AppSales;
SSMS(SSMS 管理工具条目)对应路径:安全性 → 登录(建登录)→ 数据库 → 安全性 → 用户(映射)→ 用户属性 → 权限页勾选。
裁剪顺序(先紧后松)
- 从「零权限」起步,只加应用报错说缺什么就补什么;
- 优先
EXECUTE存储过程权(把变更逻辑锁在过程里,比散表 DML 更好收敛); db_datareader/db_datawriter这类预置角色是中档选择(全库读/写),不是最小;只有应用确实跨大量表读写时才用。
常见误区:给应用账号
db_owner「省事」——等于把全库钥匙交出去,注入或误操作直接放大成库级事故。
配套纪律
- 密码策略跟域策略走(见密码策略相关条目);
- 应用账号禁直接登录 SSMS 做运维,运维走独立的 Windows 认证管理员;
- 定期审计:
sys.database_principals里列一遍谁有什么权限,清掉离职/废弃账号; - 多库应用:每个库单独映射用户,权限随库隔离。
SQL Server 2022 Developer 条目环境是演练最小权限的标准沙盒;sa 的禁用配合见「为什么要禁用 sa 账户」相关条目,SQL Server 产品族条目 中各引擎权限模型一致。