02.项目二 SQL Server 2008安全管理
02.项目二 SQL Server 2008安全管理
Section titled “02.项目二 SQL Server 2008安全管理”02.项目二 SQL Server 2008安全管理
Section titled “02.项目二 SQL Server 2008安全管理”项目二 SQL Server 2008安全管理
Section titled “项目二 SQL Server 2008安全管理”🎯 学习目标
Section titled “🎯 学习目标”通过本项目的学习,你应该能够:
- 理解并配置 SQL Server 的三种身份验证模式(Windows 身份验证、SQL Server 身份验证、混合模式),能根据实际场景选择合适的模式
- 掌握登录名与数据库用户的区别和关系,能独立完成登录名创建、数据库用户创建及二者的映射操作
- 掌握权限管理的三种控制语句(GRANT、DENY、REVOKE),理解权限优先级规则,能为用户精确分配和撤销权限
- 理解角色的概念和作用,能区分服务器角色与数据库角色,能创建和管理自定义数据库角色
- 能够通过 SSMS 界面和 T-SQL 脚本两种方式完成上述所有安全管理操作
任务一 SQL Server 身份验证模式
Section titled “任务一 SQL Server 身份验证模式”🧠 理论知识
Section titled “🧠 理论知识”三种身份验证模式
Section titled “三种身份验证模式”身份验证是识别连接 SQL Server 的操作者身份的过程。SQL Server 提供两种验证方式,组合为三种配置模式:
① Windows 身份验证模式(Windows Authentication)
- 使用 Windows 操作系统的用户账户连接 SQL Server,无需再输入单独的密码
- 利用 Windows 的 Kerberos(域环境)或 NTLM(工作组环境)协议进行身份认证
- 优点:统一账户管理,自动继承 Windows 的密码复杂性策略和账户锁定策略,安全性最高
- 适用场景:企业域环境内部应用,所有用户都有 Windows 域账户的情况
- 典型用法:公司内部的 ERP 系统、OA 系统等通过域账号直接访问数据库
② SQL Server 身份验证(SQL Server Authentication)
- 用户名和密码由 SQL Server 内部创建和存储(保存在 master 数据库的系统表中)
- 完全独立于 Windows 操作系统的账户体系
- 优点:支持跨平台访问(Linux/macOS 客户端均可使用)、不依赖 Windows 域环境
- 缺点:密码存储和管理完全由 SQL Server 负责,需要单独配置密码策略
- 适用场景:互联网应用、跨平台项目、没有 Windows 域环境的开发测试环境
③ 混合模式(Mixed Mode)
- 同时支持 Windows 身份验证和 SQL Server 身份验证
- 用户可以选择任意一种方式登录
- 教学和开发环境推荐使用,灵活度最高
- 生产环境中建议仅使用 Windows 身份验证(安全性更高)
⚠️
sa 账户说明:
- sa(System Administrator)是 SQL Server 安装时自动创建的内置超级管理员账户
- 仅在 SQL Server 身份验证或混合模式下可用
- sa 默认拥有 sysadmin 服务器角色的全部权限,可以执行任何操作
- 安全建议:生产环境应禁用 sa 账户,另外创建具名管理员账户,便于操作审计和追溯
🛠️ 实践操作
Section titled “🛠️ 实践操作”操作一:通过 SSMS 查看当前身份验证模式
Section titled “操作一:通过 SSMS 查看当前身份验证模式”📌
操作目标:了解当前 SQL Server 实例使用的是哪种身份验证模式。
- 打开 SQL Server Management Studio (SSMS) ,使用 Windows 身份验证连接到本地服务器
- 在左侧对象资源管理器中,找到服务器名称节点(最顶层,通常显示为
计算机名\实例名) - 右键点击服务器名称 → 选择 “属性(Properties)”
- 在弹出的 “服务器属性” 对话框中,点击左侧的 “安全性(Security)” 页
- 在右侧面板中查看 “服务器身份验证” 区域,可以看到当前选中的模式:
- Windows 身份验证模式:只接受 Windows 账户登录
- SQL Server 和 Windows 身份验证模式:即混合模式,两种方式都接受
- 在右侧面板中查看 “服务器身份验证” 区域,可以看到当前选中的模式:
操作二:将身份验证模式改为混合模式
Section titled “操作二:将身份验证模式改为混合模式”📌
操作目标:将身份验证模式从”仅 Windows”改为”混合模式”,以便后续可以使用 sa 等 SQL Server 登录名。
- 在 “服务器属性” 对话框的 “安全性” 页中(同上操作进入)
- 将 “服务器身份验证” 选项改为 “SQL Server 和 Windows 身份验证模式”
- 点击 “确定” 关闭对话框
- 此时 SSMS 会弹出提示: “更改服务器身份验证模式后,需要重新启动 SQL Server 才能生效”
- 重启 SQL Server 服务:
- 方法一(SSMS 界面) :在对象资源管理器中右键服务器名称 → 选择 “重新启动(Restart)” → 确认重启
- 方法二(服务管理器) :打开 Windows “服务” 管理器(
services.msc),找到 SQL Server (实例名) 服务 → 右键 “重新启动” - 方法三(SQL Server 配置管理器) :打开 SQL Server Configuration Manager → 在左侧选择 SQL Server 服务 → 右键对应实例 → “重新启动”
操作三:通过 SSMS 界面启用 sa 账户并设置密码
Section titled “操作三:通过 SSMS 界面启用 sa 账户并设置密码”📌
操作目标:启用被禁用的 sa 账户,并为其设置一个强密码,以便使用 SQL Server 身份验证登录。
- 在 SSMS 的对象资源管理器中,展开 “安全性(Security)” 节点
- 展开 “登录名(Logins)” 子节点
- 找到 sa 登录名(可能显示一个红色向下箭头 ↓,表示已禁用)
- 双击 sa 或右键 → “属性(Properties)” ,打开 “登录属性” 对话框
- 在 “常规(General)” 页中:
- 确认身份验证方式为 “SQL Server 身份验证”
- 在 “密码” 和 “确认密码” 栏中输入新密码(需符合密码复杂性要求,如
StrongP@ssw0rd123!)
- 切换到左侧 “状态(Status)” 页:
- 将 “登录(Login)” 选项改为 “已启用(Enabled)” (如果当前是”已禁用”)
- 点击 “确定” 保存设置
- 验证:断开当前连接 → 重新连接时选择 “SQL Server 身份验证” → 输入用户名
sa和刚设置的密码 → 成功连接即表示 sa 账户已正常启用
操作四:使用 T-SQL 脚本启用 sa(补充方法)
Section titled “操作四:使用 T-SQL 脚本启用 sa(补充方法)”💡
以下 T-SQL 脚本与上面的界面操作效果完全相同,适合批量操作或脚本化管理的场景。
USE master;
-- 启用 sa 账户ALTER LOGIN sa ENABLE;
-- 设置强密码ALTER LOGIN sa WITH PASSWORD = 'StrongP@ssw0rd123!';
-- 查看所有登录名状态(验证 sa 是否已启用)SELECT name, type_desc, is_disabled, create_dateFROM sys.server_principalsWHERE type IN ('S','U','G')ORDER BY type_desc, name;📝 任务一知识点总结
Section titled “📝 任务一知识点总结”✅
核心知识点回顾:
- SQL Server 提供三种身份验证模式:Windows 身份验证(最安全,适合域环境)、SQL Server 身份验证(跨平台,独立账户)、混合模式(两者兼容,教学推荐)
- sa 是内置超级管理员账户,拥有 sysadmin 角色全部权限,生产环境建议禁用
- 更改身份验证模式后必须重启 SQL Server 服务才能生效
- 可通过 SSMS 界面或 T-SQL 脚本(
ALTER LOGIN)两种方式管理登录名和验证模式
任务二 数据库用户管理
Section titled “任务二 数据库用户管理”🧠 理论知识
Section titled “🧠 理论知识”登录名与数据库用户的区别
Section titled “登录名与数据库用户的区别”这是 SQL Server 安全管理中最核心的概念,必须理解清楚:
🔑
核心要点:登录名(Login)是”能不能进入 SQL Server 大门”的钥匙;数据库用户(User)是”进入大门后能不能进入某个房间”的通行证。一个登录名想要访问某个数据库,必须在该数据库中有一个对应的数据库用户。
SQL Server 实例├── 登录名(Login)← 服务器级别,控制能否连接到 SQL Server 实例│ ↓ 映射(一对多)└── 数据库 A│ └── 数据库用户(User)← 数据库级别,控制能否访问该数据库└── 数据库 B └── 数据库用户(User)← 同一个登录名可映射到不同数据库的用户| 层级 | 对象 | 作用 | 存储位置 |
|---|---|---|---|
| 服务器级 | 登录名(Login) | 允许建立到 SQL Server 实例的连接 | master 数据库的 sys.server_principals |
| 数据库级 | 数据库用户(User) | 允许在特定数据库中执行操作 | 各数据库的 sys.database_principals |
⚠️
关键规则:一个登录名可以映射到多个数据库中的用户,但在同一个数据库中只能映射到一个用户。违反此规则时系统会报错。
🛠️ 实践操作
Section titled “🛠️ 实践操作”操作一:通过 SSMS 界面创建 SQL Server 登录名
Section titled “操作一:通过 SSMS 界面创建 SQL Server 登录名”📌
操作目标:创建一个名为 zhang_login 的 SQL Server 身份验证登录名。
- 在 SSMS 对象资源管理器中,展开 “安全性(Security)” 节点
- 右键点击 “登录名(Logins)” → 选择 “新建登录名(New Login…)”
- 在弹出的 “登录名 - 新建” 对话框中:
- 常规(General)页:
- 登录名:输入
zhang_login - 选择 “SQL Server 身份验证”
- 输入密码和确认密码(如
P@ssw0rd123!) - 可选:取消勾选”用户在下次登录时必须更改密码”(教学环境方便演示)
- 可选:勾选”强制实施密码策略”和”强制密码过期”
- 默认数据库:选择
stusta
- 登录名:输入
- 服务器角色(Server Roles)页:
- 默认只勾选
public,暂不添加其他角色
- 默认只勾选
- 用户映射(User Mapping)页:
- 暂时不映射,我们将在下一步手动创建数据库用户
- 常规(General)页:
- 点击 “确定” 完成创建
- 在登录名列表中可以看到新创建的
zhang_login
操作二:通过 SSMS 界面创建 Windows 登录名
Section titled “操作二:通过 SSMS 界面创建 Windows 登录名”📌
操作目标:将一个 Windows 用户账户添加为 SQL Server 登录名(仅在域环境或本地 Windows 用户存在时可用)。
- 右键 “登录名” → “新建登录名”
- 在常规页中:
- 选择 “Windows 身份验证”
- 点击 “搜索” 按钮 → 在弹出的对话框中输入 Windows 用户名(如
Administrator) → 点击 “检查名称” 确认 → 点击”确定” - 登录名会自动填充为
计算机名\用户名的格式
- 点击 “确定” 完成
操作三:通过 SSMS 界面创建数据库用户
Section titled “操作三:通过 SSMS 界面创建数据库用户”📌
操作目标:在 stusta 数据库中为 zhang_login 创建一个对应的数据库用户。
- 在对象资源管理器中,展开 “数据库” → 展开 stusta 数据库
- 展开 “安全性(Security)” → 右键 “用户(Users)” → 选择 “新建用户(New User…)”
- 在弹出的 “数据库用户 - 新建” 对话框中:
- 常规(General)页:
- 用户类型:选择”具有登录名的 SQL 用户”
- 用户名:输入
zhang_user - 登录名:点击右侧 “…” 按钮 → 搜索并选择
zhang_login→ 确定 - 默认架构:输入
dbo(如果留空则默认也是 dbo)
- 成员身份(Membership)页:
- 暂时不勾选任何数据库角色(后续在权限管理与角色管理中继续配置)
- 常规(General)页:
- 点击 “确定”
- 在 stusta → 安全性 → 用户 列表中可以看到
zhang_user
操作四:通过 SSMS 界面修改和删除数据库用户
Section titled “操作四:通过 SSMS 界面修改和删除数据库用户”修改用户名:
- 在用户列表中找到
zhang_user→ 双击或右键 “属性” - 在常规页中修改用户名为
zhang_new→ 确定
删除数据库用户:
- 右键
zhang_new→ “删除(Delete)” → 确认
删除登录名:
- 回到安全性 → 登录名列表,右键
zhang_login→ “删除” → 确认
⚠️
注意顺序:删除登录名之前,应先删除所有数据库中与该登录名关联的数据库用户,否则会产生”孤立用户”。
操作五:T-SQL 参考脚本(补充)
Section titled “操作五:T-SQL 参考脚本(补充)”💡
以下 T-SQL 与上面的界面操作效果相同,供脚本化操作参考。
-- ===== 服务器级操作 =====USE master;
-- 创建 SQL Server 登录名CREATE LOGIN zhang_login WITH PASSWORD = 'P@ssw0rd123!', DEFAULT_DATABASE = stusta, CHECK_EXPIRATION = ON, CHECK_POLICY = ON;
-- 创建 Windows 登录名CREATE LOGIN [计算机名\zhangsan] FROM WINDOWS WITH DEFAULT_DATABASE = stusta;
-- ===== 数据库级操作 =====USE stusta;
-- 创建数据库用户并关联到登录名CREATE USER zhang_user FOR LOGIN zhang_login WITH DEFAULT_SCHEMA = dbo;
-- 修改数据库用户名ALTER USER zhang_user WITH NAME = zhang_new;
-- 删除数据库用户DROP USER zhang_new;
-- 删除登录名USE master;DROP LOGIN zhang_login;操作六:完整用户创建与权限验证流程(综合演示)
Section titled “操作六:完整用户创建与权限验证流程(综合演示)”📌
操作目标:完整走通”创建登录名→创建用户→授权→验证权限”的全流程。
第一步:创建登录名(SSMS 界面)
- 安全性 → 登录名 → 右键”新建登录名”
- 选择 SQL Server 身份验证,登录名输入
testuser,密码Test@123456 - 取消勾选”用户在下次登录时必须更改密码”→ 确定
第二步:创建数据库用户(SSMS 界面)
- 展开 stusta → 安全性 → 用户 → 右键”新建用户”
- 用户名
testuser,登录名选择testuser→ 确定
第三步:授予权限(SSMS 界面)
- 在 stusta → 安全性 → 用户中,双击
testuser打开属性 - 切换到 “安全对象(Securables)” 页
- 点击 “搜索” → 选择”特定对象”→ 对象类型选”表”→ 浏览并勾选
stu表 → 确定 - 在下方权限列表中,为
stu表勾选 SELECT 的”授予”列 → 确定
第四步:验证权限(T-SQL 测试)
-- 切换到 testuser 身份测试EXECUTE AS USER = 'testuser';SELECT * FROM stu; -- ✅ 应成功(已授予 SELECT)INSERT INTO stu VALUES('X','X','男',20,'X'); -- ❌ 应失败(未授予 INSERT)REVERT; -- 恢复原身份第五步:查看所有数据库用户(SSMS 界面)
- 展开 stusta → 安全性 → 用户,即可看到所有数据库用户列表
- 双击任意用户可查看其属性、所属角色、权限等信息
📝 任务二知识点总结
Section titled “📝 任务二知识点总结”✅
核心知识点回顾:
- 登录名(Login) 是服务器级别的”大门钥匙”,控制能否连接到 SQL Server 实例
- 数据库用户(User) 是数据库级别的”房间通行证”,控制能否访问特定数据库
- 一个登录名可以映射到多个数据库中的用户,但在同一个数据库中只能映射到一个用户
- 登录名存储在
master.sys.server_principals,数据库用户存储在各数据库的sys.database_principals - 删除登录名前应先删除关联的数据库用户,避免产生孤立用户
- 完整流程:创建登录名 → 创建数据库用户并映射 → 授权 → 验证
⚡ 任务二重难点提示
Section titled “⚡ 任务二重难点提示”🔥
重点:
- 登录名与数据库用户的区别和映射关系
- 创建登录名和数据库用户的完整操作流程(SSMS 界面 + T-SQL 两种方式)
难点:
- 两层安全体系的理解:很多初学者混淆登录名和用户,以为创建了登录名就能访问数据库——实际上还需要在目标数据库中创建对应的用户
- 同一登录名在不同数据库中的用户可以有不同的名称和不同的权限
易错点:
- 只创建了登录名而忘记创建数据库用户,导致登录后无法访问任何数据库
CREATE USER zhang_user FOR LOGIN zhang_login中的FOR LOGIN关键字不能省略,否则创建的是无登录名的独立用户
任务三 权限管理
Section titled “任务三 权限管理”🧠 理论知识
Section titled “🧠 理论知识”💡
在已经完成登录名创建和数据库用户映射之后,下一步最自然的问题就是:这个用户到底能做什么? 因此先掌握 GRANT、DENY、REVOKE 等权限控制,再进入角色的批量授权思路,知识衔接会更顺。
| 权限类型 | 说明 | 示例 |
|---|---|---|
| 隐含权限 | 固定角色自带的权限,无法单独撤销 | sysadmin 角色成员自动拥有所有权限 |
| 对象权限 | 对表、视图、存储过程等数据库对象的操作权限 | SELECT、INSERT、UPDATE、DELETE、EXECUTE |
| 语句权限 | 执行特定 DDL(数据定义)语句的权限 | CREATE TABLE、CREATE VIEW、CREATE DATABASE |
三种权限控制语句
Section titled “三种权限控制语句”| 语句 | 作用 | 效果 |
|---|---|---|
| GRANT | 授予权限 | 用户获得指定操作的权限 |
| DENY | 明确拒绝权限 | 即使通过角色继承了权限,也被强制拒绝(优先级最高) |
| REVOKE | 撤销已有的 GRANT 或 DENY | 恢复为”未授权”的中间状态 |
权限优先级规则:
🔑
DENY > GRANT > 继承自角色的权限 > 无权限(默认拒绝)
例外:sysadmin 角色成员不受 DENY 限制,始终拥有无条件最高权限。
三种特殊用户
Section titled “三种特殊用户”| 用户类型 | 说明 | 权限特点 |
|---|---|---|
| 系统管理员(sysadmin 角色成员) | 可执行 SQL Server 中的任何操作 | 不受 DENY 约束,拥有无条件最高权限 |
| 数据库所有者(dbo) | 创建数据库的账号,映射为该数据库的 dbo 用户 | 拥有该数据库的全部权限 |
| 一般用户 | 普通数据库用户 | 通过 GRANT/DENY/角色来精确控制权限 |
🛠️ 实践操作
Section titled “🛠️ 实践操作”操作一:通过 SSMS 界面授予对象权限
Section titled “操作一:通过 SSMS 界面授予对象权限”📌
操作目标:为 testuser 授予对 stu 表的 SELECT 和 INSERT 权限,对 course 表的 SELECT 权限。
- 展开 stusta → 安全性 → 用户 → 双击
testuser打开属性 - 切换到 “安全对象(Securables)” 页
- 点击 “搜索” → 选择 “特定对象” → 对象类型选择 “表”
- 点击 “浏览” → 勾选
stu和course→ 确定 - 在下方权限列表中:
- 选中 stu 表 → 勾选 SELECT 和 INSERT 的 “授予(Grant)” 列
- 选中 course 表 → 勾选 SELECT 的 “授予(Grant)” 列
- 点击 “确定” 保存
操作二:通过 SSMS 界面拒绝权限(DENY)
Section titled “操作二:通过 SSMS 界面拒绝权限(DENY)”📌
操作目标:明确拒绝 testuser 对 stu 表的 DELETE 权限。
- 打开 testuser 的用户属性 → 安全对象页
- 如果 stu 表已在·安全对象列表中,直接选中它
- 在下方权限列表中,找到 DELETE 行 → 勾选 “拒绝(Deny)” 列
- 确定保存
⚠️
重要:即使 testuser 后来被加入了 db_datawriter 角色(拥有所有表的写权限),由于 DENY 优先级高于 GRANT,testuser 仍然无法删除 stu 表的数据。
操作三:通过 SSMS 界面撤销权限(REVOKE)
Section titled “操作三:通过 SSMS 界面撤销权限(REVOKE)”- 打开 testuser 的用户属性 → 安全对象页
- 选中 stu 表
- 取消 INSERT 的”授予”勾选(变为空白,即撤销 GRANT)
- 取消 DELETE 的”拒绝”勾选(即撤销 DENY)
- 确定保存
操作四:通过 SSMS 界面查看用户的有效权限
Section titled “操作四:通过 SSMS 界面查看用户的有效权限”- 展开 stusta → 表 → 右键某张表(如
stu)→ “属性” - 切换到 “权限(Permissions)” 页
- 可以看到对该表拥有权限的所有用户和角色列表
- 选中某个用户,下方显示其具体权限状态(已授予/已拒绝/继承)
操作五:T-SQL 参考脚本(补充)
Section titled “操作五:T-SQL 参考脚本(补充)”💡
以下 T-SQL 与上面的界面操作效果相同。
USE stusta;
-- ===== GRANT 授予权限 =====GRANT SELECT, INSERT ON stu TO testuser;GRANT SELECT ON course TO testuser;
-- 使用 WITH GRANT OPTION 允许被授权者将此权限再授予他人GRANT SELECT ON course TO testuser WITH GRANT OPTION;
-- ===== DENY 明确拒绝 =====DENY DELETE ON stu TO testuser;
-- ===== REVOKE 撤销 =====REVOKE INSERT ON stu FROM testuser; -- 撤销 GRANTREVOKE DENY DELETE ON stu FROM testuser; -- 撤销 DENY操作六:综合权限验证演示
Section titled “操作六:综合权限验证演示”USE stusta;
-- 先授予一组权限GRANT SELECT, INSERT, UPDATE ON stu TO testuser;GRANT SELECT ON course TO testuser;DENY DELETE ON stu TO testuser;
-- 验证1:查看用户对某对象的权限明细SELECT dp.state_desc AS 权限状态, dp.permission_name AS 权限名称, OBJECT_NAME(dp.major_id) AS 对象名称, u.name AS 用户名FROM sys.database_permissions dpJOIN sys.database_principals u ON dp.grantee_principal_id = u.principal_idWHERE u.name = 'testuser' AND dp.major_id > 0;
-- 验证2:模拟 testuser 查看有效权限EXECUTE AS USER = 'testuser';SELECT * FROM fn_my_permissions('stu', 'OBJECT');REVERT;
-- 验证3:实际操作测试EXECUTE AS USER = 'testuser';SELECT * FROM stu; -- ✅ 成功INSERT INTO stu VALUES('X','X','男',20,'X'); -- ✅ 成功(已授予 INSERT)DELETE FROM stu WHERE 1=0; -- ❌ 失败(被 DENY)REVERT;📝 任务三知识点总结
Section titled “📝 任务三知识点总结”✅
核心知识点回顾:
- 权限分三类:隐含权限(角色自带)、对象权限(SELECT/INSERT/UPDATE/DELETE/EXECUTE)、语句权限(CREATE TABLE 等 DDL)
- 三种权限控制语句:GRANT(授予)、DENY(明确拒绝)、REVOKE(撤销已有的 GRANT 或 DENY)
- 权限优先级:DENY > GRANT > 角色继承 > 默认拒绝(sysadmin 例外,不受 DENY 限制)
- 三种特殊用户:sysadmin 成员(无条件最高权限)、dbo(数据库所有者)、一般用户(需显式授权)
- 使用
EXECUTE AS USER和fn_my_permissions()可模拟用户身份验证权限是否生效 WITH GRANT OPTION允许被授权者将权限再转授他人
⚡ 任务三重难点提示
Section titled “⚡ 任务三重难点提示”🔥
重点:
- GRANT、DENY、REVOKE 三者的区别和用法,尤其是 DENY 与 REVOKE 的区别(DENY 是“明确禁止”,REVOKE 是“取消之前的授权/拒绝”)
- 权限优先级链:DENY > GRANT > 角色继承 > 默认拒绝
- 能够区分隐含权限、对象权限、语句权限三种类型
难点:
- 权限叠加与冲突场景:当用户同时通过角色获得 GRANT 和直接被 DENY 时,最终结果是被拒绝(DENY 优先)——这是最常见的考题场景
- REVOKE 和 DENY 的效果不同:REVOKE 后用户可能仍通过角色拥有权限,而 DENY 会彻底封死
- sysadmin 成员不受 DENY 限制是特殊例外,考试中常作为干扰项出现
易错点:
- 混淆 REVOKE 和 DENY:想禁止用户某个权限应用 DENY,仅用 REVOKE 可能无效(因为角色仍可提供权限)
REVOKE DENY DELETE ON stu FROM testuser是撤销之前的 DENY,不是授予 DELETE 权限- 在中文版 SSMS 中,权限名称显示为中文:SELECT→选择、INSERT→插入、UPDATE→更新、DELETE→删除、EXECUTE→执行
任务四 角色管理
Section titled “任务四 角色管理”🧠 理论知识
Section titled “🧠 理论知识”为什么需要角色?
Section titled “为什么需要角色?”💡
当你已经理解了单个用户的权限如何授予、拒绝和撤销之后,就会发现:如果很多用户需要同一组权限,逐个授权会非常繁琐。此时就需要引入角色,把一组权限打包,再批量分配给多个用户。
服务器角色(固定,系统预定义)
Section titled “服务器角色(固定,系统预定义)”作用范围:整个 SQL Server 实例。这些角色是系统内置的,不能新增或删除。
| 服务器角色 | 权限说明 | 典型使用场景 |
|---|---|---|
| sysadmin | 超级管理员,可执行任何操作(不受 DENY 限制) | DBA 总管理员 |
| securityadmin | 管理登录名和权限(可 GRANT/DENY/REVOKE 服务器权限) | 安全管理员 |
| serveradmin | 配置服务器设置(内存、连接数、关闭服务器等) | 运维管理员 |
| setupadmin | 管理链接服务器(Linked Server) | 集成管理 |
| processadmin | 终止 SQL Server 中正在运行的进程 | 处理阻塞/死锁 |
| diskadmin | 管理磁盘文件(备份设备等) | 存储管理 |
| dbcreator | 创建、修改、删除和还原数据库 | 开发人员(需建库权限时) |
| bulkadmin | 执行 BULK INSERT 批量导入操作 | 数据导入专员 |
| public | 最低权限,所有登录名自动成为成员,不可移除 | 默认基础角色 |
数据库角色(固定,作用于特定数据库)
Section titled “数据库角色(固定,作用于特定数据库)”| 数据库角色 | 权限说明 | 典型使用场景 |
|---|---|---|
| db_owner | 数据库所有者,拥有该数据库的全部权限 | 数据库管理员 |
| db_accessadmin | 管理数据库用户的访问(添加/删除用户) | 用户管理 |
| db_securityadmin | 管理角色成员和数据库权限 | 权限管理 |
| db_ddladmin | 执行 DDL 语句(CREATE/ALTER/DROP 表、视图等) | 开发人员 |
| db_backupoperator | 备份数据库 | 备份操作员 |
| db_datareader | 读取所有用户表的数据(SELECT) | 只读查询用户 |
| db_datawriter | 写入所有用户表(INSERT/UPDATE/DELETE) | 数据录入员 |
| db_denydatareader | 拒绝读取所有用户表(优先级高于 db_datareader) | 特殊限制场景 |
| db_denydatawriter | 拒绝写入所有用户表(优先级高于 db_datawriter) | 特殊限制场景 |
| public | 所有数据库用户自动成为成员 | 默认基础角色 |
💡
组合使用示例:如果想让用户只能读取数据但不能修改,将其加入 db_datareader 角色即可。如果想让用户既能读又能写,则同时加入 db_datareader 和 db_datawriter。
用户自定义数据库角色
Section titled “用户自定义数据库角色”当固定角色粒度太粗时(例如只想让某些用户读取部分表而非全部表),可以创建自定义角色,实现更精细的权限控制。
🛠️ 实践操作
Section titled “🛠️ 实践操作”操作一:通过 SSMS 界面将登录名添加到服务器角色
Section titled “操作一:通过 SSMS 界面将登录名添加到服务器角色”📌
操作目标:将 testuser 登录名添加到 dbcreator 服务器角色,使其拥有创建数据库的权限。
- 在对象资源管理器中,展开 “安全性” → “登录名”
- 双击
testuser(或右键 → 属性),打开 “登录属性” 对话框 - 切换到左侧 “服务器角色(Server Roles)” 页
- 在角色列表中勾选 dbcreator(
public已默认勾选且不可取消) - 点击 “确定”
- 验证:用 testuser 登录后尝试
CREATE DATABASE test_db;,应能成功
操作二:通过 SSMS 界面将数据库用户添加到数据库角色
Section titled “操作二:通过 SSMS 界面将数据库用户添加到数据库角色”📌
操作目标:将 stusta 数据库中的 testuser 用户添加到 db_datareader 角色,使其可以读取所有表。
方法一:从用户属性进入
- 展开 stusta → 安全性 → 用户 → 双击
testuser - 切换到 “成员身份(Membership)” 页
- 勾选 db_datareader → 确定
方法二:从角色属性进入
- 展开 stusta → 安全性 → 角色 → 数据库角色
- 双击 db_datareader 打开属性
- 点击 “添加” 按钮 → 输入
testuser→ 检查名称 → 确定 → 确定
操作三:通过 SSMS 界面创建自定义数据库角色
Section titled “操作三:通过 SSMS 界面创建自定义数据库角色”📌
操作目标:创建一个名为 report_reader 的只读报表角色,只允许查询 stu、course、score 三张表。
第一步:创建角色
- 展开 stusta → 安全性 → 角色 → 右键 “数据库角色” → “新建数据库角色(New Database Role…)”
- 角色名称输入
report_reader→ 所有者保持默认dbo - 在 “成员(Members)” 区域,点击 “添加” → 输入
testuser→ 检查名称 → 确定 - 暂时先点击 “确定” 创建角色
第二步:为角色授予权限
- 在数据库角色列表中,双击
report_reader打开属性 - 切换到 “安全对象(Securables)” 页
- 点击 “搜索” → 选择 “特定对象” → 对象类型选 “表”
- 点击 “浏览” → 勾选
stu、course、score三张表 → 确定 - 在下方的权限列表中,逐个选择每张表,为其勾选 SELECT 的 “授予(Grant)” 列
- 点击 “确定” 保存
第三步:验证
-- 模拟 testuser 登录验证EXECUTE AS USER = 'testuser';SELECT * FROM stu; -- ✅ 应成功SELECT * FROM course; -- ✅ 应成功SELECT * FROM score; -- ✅ 应成功DELETE FROM stu WHERE 1=0; -- ❌ 应失败REVERT;操作四:从角色中移除成员和删除角色(SSMS 界面)
Section titled “操作四:从角色中移除成员和删除角色(SSMS 界面)”- 双击
report_reader角色 → 在成员列表中选中testuser→ 点击 “删除” → 确定 - 右键
report_reader→ “删除” → 确认(如果角色中还有成员,需先全部移除)
操作五:T-SQL 参考脚本(补充)
Section titled “操作五:T-SQL 参考脚本(补充)”💡
以下 T-SQL 与上面的界面操作效果相同。
-- 将登录名添加到服务器角色ALTER SERVER ROLE dbcreator ADD MEMBER testuser;
-- 将数据库用户添加到数据库角色USE stusta;ALTER ROLE db_datareader ADD MEMBER testuser;
-- 创建自定义角色并授权CREATE ROLE report_reader;GRANT SELECT ON stu TO report_reader;GRANT SELECT ON course TO report_reader;GRANT SELECT ON score TO report_reader;ALTER ROLE report_reader ADD MEMBER testuser;
-- 查看角色成员EXEC sp_helprolemember 'report_reader';
-- 移除成员并删除角色ALTER ROLE report_reader DROP MEMBER testuser;DROP ROLE report_reader;操作六:查看服务器和数据库角色成员(SSMS 界面)
Section titled “操作六:查看服务器和数据库角色成员(SSMS 界面)”查看服务器角色成员:
- 展开 安全性 → 服务器角色 → 双击某个角色(如
sysadmin) - 在属性对话框中可以看到该角色的所有成员列表
查看数据库角色成员:
- 展开 stusta → 安全性 → 角色 → 数据库角色 → 双击某个角色
- 在属性对话框的”成员”区域查看
操作七:应用程序角色(了解)
Section titled “操作七:应用程序角色(了解)”💡
应用程序角色是一种特殊角色,不包含成员,仅由应用程序通过密码激活后临时获得权限。适合限制用户只能通过指定应用程序访问数据库。
-- 创建应用程序角色CREATE APPLICATION ROLE hr_app WITH PASSWORD = 'AppP@ss123!', DEFAULT_SCHEMA = dbo;
-- 为应用程序角色授权GRANT SELECT, INSERT, UPDATE ON stu TO hr_app;
-- 在应用程序代码中激活(连接后执行)EXEC sp_setapprole 'hr_app', 'AppP@ss123!';📝 任务四知识点总结
Section titled “📝 任务四知识点总结”✅
核心知识点回顾:
- 角色是权限的打包集合,用于简化批量权限管理,避免逐个用户授权
- 服务器角色:系统预定义、不可增删,作用于整个 SQL Server 实例(sysadmin、dbcreator、securityadmin 等共 9 个)
- 数据库角色:系统预定义,作用于特定数据库(db_owner、db_datareader、db_datawriter 等共 10 个)
- 自定义数据库角色:当固定角色粒度太粗时使用,可实现表级别的精细权限控制
- 应用程序角色:不含成员,由应用程序通过密码激活,限制只能通过特定应用访问数据库
- 权限组合技巧:db_datareader = 只读;db_datareader + db_datawriter = 读写
⚡ 任务四重难点提示
Section titled “⚡ 任务四重难点提示”🔥
重点:
- 服务器角色与数据库角色的区别:服务器角色管整个实例(如创建数据库、管理登录名),数据库角色管单个数据库(如读写表数据)
- 熟记常用角色:sysadmin、dbcreator、db_owner、db_datareader、db_datawriter
- 自定义角色的创建→授权→添加成员全流程
难点:
- db_denydatareader / db_denydatawriter 的优先级问题:如果用户同时属于 db_datareader 和 db_denydatareader,结果是无法读取(DENY 优先)——这是最常见的考题场景
- 服务器角色是固定的不能新建,而数据库角色可以自定义——不要混淆
易错点:
- 服务器角色分配给登录名,数据库角色分配给数据库用户——不要搞反对象
- 删除角色前必须先移除所有成员,否则删除操作会失败
- public 角色是默认角色,所有用户自动属于它,不能移除成员也不能删除
🏁 项目总结
Section titled “🏁 项目总结”📚
SQL Server 安全管理四大核心:
- 身份验证:谁可以连接?→ 三种验证模式
- 用户管理:谁可以访问哪个数据库?→ 登录名 + 数据库用户映射
- 权限管理:具体能做什么操作?→ GRANT / DENY / REVOKE 精确控制
- 角色管理:如何高效分配权限?→ 服务器角色 + 数据库角色 + 自定义角色
安全管理的核心原则是最小权限原则:只授予用户完成工作所需的最低权限,避免过度授权带来的安全风险。