You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过SQL脚本实现SQL Server单用户仅访问对应数据库的配置?

SQL Server 实现单用户对应单数据库的权限隔离

核心结论

先明确一个关键事实:SQL Server里的User是数据库级对象,根本没法设置密码——密码是绑定在服务器级的Login上的。所以你想让单个Login对应多个带独立密码的User?这行不通,因为一个Login只有一个密码,所有映射到它的User都得用这个密码登录。

如果你的需求是「每个用户(对应单个数据库)有独立密码,且只能访问自己的数据库」,那必须给每个数据库单独建Login,再在对应库中建映射的User——这样每个Login有自己的密码,权限也能严格隔离。

实现方案(SQL脚本)

方案1:每个数据库对应独立Login+User(满足独立密码+单库访问)

下面是批量创建的示例脚本,你可以根据实际需求修改数据库名、Login/用户名和密码:

-- 1. 创建第一个数据库及对应的Login、User
CREATE DATABASE DB_App01;
GO

CREATE LOGIN Login_App01 WITH PASSWORD = 'StrongPass_01', CHECK_EXPIRATION = ON, CHECK_POLICY = ON;
GO

USE DB_App01;
GO

CREATE USER User_App01 FOR LOGIN Login_App01;
GO

-- 授予该用户数据库的基本读写权限(可根据需求调整,比如仅读或自定义权限)
ALTER ROLE db_datareader ADD MEMBER User_App01;
ALTER ROLE db_datawriter ADD MEMBER User_App01;
GO

-- 2. 创建第二个数据库及对应的Login、User
CREATE DATABASE DB_App02;
GO

CREATE LOGIN Login_App02 WITH PASSWORD = 'StrongPass_02', CHECK_EXPIRATION = ON, CHECK_POLICY = ON;
GO

USE DB_App02;
GO

CREATE USER User_App02 FOR LOGIN Login_App02;
GO

ALTER ROLE db_datareader ADD MEMBER User_App02;
ALTER ROLE db_datawriter ADD MEMBER User_App02;
GO

-- 可选:限制Login仅能访问对应数据库(默认Login有public角色,能看到所有数据库,可通过拒绝权限隐藏)
USE master;
GO

-- 拒绝Login_App01访问其他数据库的权限
DENY VIEW ANY DATABASE TO Login_App01;
-- 仅允许Login_App01看到并访问DB_App01
GRANT VIEW DEFINITION ON DATABASE::DB_App01 TO Login_App01;
GO

DENY VIEW ANY DATABASE TO Login_App02;
GRANT VIEW DEFINITION ON DATABASE::DB_App02 TO Login_App02;
GO

方案2:单个Login对应多个User(不满足独立密码,仅作概念补充)

如果不需要独立密码,只是想让同一个登录账号访问多个数据库(但这不符合你「每个User仅能访问对应一个数据库」的需求,仅作概念说明):

-- 创建一个服务器级共享Login
CREATE LOGIN Login_Shared WITH PASSWORD = 'SharedPass_01', CHECK_EXPIRATION = ON, CHECK_POLICY = ON;
GO

-- 创建第一个数据库及映射User
CREATE DATABASE DB_Shared01;
GO
USE DB_Shared01;
CREATE USER User_Shared01 FOR LOGIN Login_Shared;
ALTER ROLE db_datareader ADD MEMBER User_Shared01;
GO

-- 创建第二个数据库及映射User
CREATE DATABASE DB_Shared02;
GO
USE DB_Shared02;
CREATE USER User_Shared02 FOR LOGIN Login_Shared;
ALTER ROLE db_datareader ADD MEMBER User_Shared02;
GO

注意:这个方案中所有User共用同一个Login的密码,且如果不额外限制,该Login可以访问所有映射了User的数据库,完全不符合你的权限隔离需求。

关键说明

  • Login与User的映射规则:一个Login可以映射到多个数据库的User,但一个User只能绑定到一个Login。
  • 权限隔离细节:通过DENY VIEW ANY DATABASE可以隐藏其他数据库,确保Login仅能看到自己对应的库;再通过数据库角色或自定义权限,限制User在对应数据库内的操作范围。
  • 密码安全规范:建议开启CHECK_EXPIRATION和CHECK_POLICY,强制密码复杂度和过期策略,符合企业安全要求。

内容的提问来源于stack exchange,提问作者Manngo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 13:26:08