什么是服务器角色?
服务器角色是 SQL Server 中一种预定义的权限集合,用于授予用户或登录账户在服务器级别上执行特定管理任务的权限,你可以把它想象成一个“管理团队”的职位,每个职位都有一套明确的责任和权限。

将一个登录账户添加到某个服务器角色中,就相当于授予了该角色所包含的所有权限,这是一种高效、批量管理服务器级权限的方式。
两种类型的服务器角色
SQL Server 提供了两类服务器角色:
- 固定服务器角色:由 SQL Server 预先定义,其权限和成员关系不能被修改,你不能添加新的权限,也不能从固定角色中删除其内置的权限,这是最常用、最核心的服务器角色。
- 用户定义的服务器角色:从 SQL Server 2012 (SQL Server Denali) 开始引入,允许数据库管理员根据需要创建自定义的服务器角色,这使得权限管理更加灵活和贴近实际业务需求。
固定服务器角色详解
固定服务器角色是 SQL Server 权限体系的基础,以下是每个固定角色的详细说明,按权限从高到低排列:
| 服务器角色 | 权限描述 | 主要用途 |
|---|---|---|
| sysadmin | 最高权限,相当于 SQL Server 中的系统管理员,该角色的成员可以执行任何活动,并且可以绕过所有安全检查。 | 负责整个 SQL Server 实例的全面管理和维护,通常只有少数核心 DBA 才是该角色的成员。 |
| securityadmin | 负责管理登录名和凭据,可以管理 LOGIN 权限,读取和写入 sys.server_principals 视图,以及管理服务器级别的权限。 |
管理服务器的安全策略,如创建/禁用登录账户、管理密码策略等。 |
| serveradmin | 负责配置服务器范围的设置,可以更改服务器范围的配置选项(如 max memory, backup compression default),关闭服务器 (SHUTDOWN)。 |
管理整个 SQL Server 实例的配置和运行时行为。 |
| setupadmin | 负责管理服务器范围的配置,可以添加和删除链接服务器,并运行某些存储过程(如 sp_serveroption)。 |
主要用于安装和管理扩展功能,如链接服务器、复制等。 |
| processadmin | 负责管理在 SQL Server 中运行的进程,可以终止(KILL)任何会话(SPID)。 |
用于处理长时间运行或占用过多资源的查询/会话,强制其结束。 |
| diskadmin | 管理磁盘文件,只能管理用于备份和数据库文件(DATABASE 权限)的文件组。 |
通常用于自动化备份任务或管理数据库文件的存放位置。 |
| dbcreator | 负责创建、更改、删除和还原任何数据库。 | 允许用户创建新的数据库实例,但并不意味着能访问或管理数据库内的数据。 |
| public | 一个特殊的角色,每个登录账户默认都是 public 角色的成员,且无法从中移除,它不拥有任何特定的权限,但它是一个“安全主体”,可以接收公共权限。 |
作为所有用户的默认容器,用于授予一些所有用户都应该有的基础权限(VIEW ANY DATABASE)。谨慎授予 public 角色过多权限,因为它会影响所有用户。 |
如何管理服务器角色成员?
你可以使用以下几种方式来管理服务器角色的成员:

使用 SQL Server Management Studio (SSMS)
这是最直观的方式。
- 在 对象资源管理器 中,展开服务器实例。
- 展开 “安全性” 文件夹。
- 展开 “服务器角色” 文件夹。
- 右键单击你想要修改的角色(
dbcreator),然后选择 “属性”。 - 在弹出的窗口中,点击 “添加” 或 “删除” 按钮来添加或移除登录账户。
- 点击 “确定” 保存更改。
使用 Transact-SQL (T-SQL)
这是更灵活、更适用于自动化脚本的方式。
添加成员:
使用 sp_addsrvrolemember 存储过程。

-- 将 Windows 用户 'DOMAIN\username' 添加到 sysadmin 角色 EXEC sp_addsrvrolemember @loginame = 'DOMAIN\username', @rolename = 'sysadmin'; -- 将 SQL Server 登录名 'sql_login_user' 添加到 dbcreator 角色 EXEC sp_addsrvrolemember @loginame = 'sql_login_user', @rolename = 'dbcreator';
移除成员:
使用 sp_dropsrvrolemember 存储过程。
-- 将 'DOMAIN\username' 从 sysadmin 角色中移除 EXEC sp_dropsrvrolemember @loginame = 'DOMAIN\username', @rolename = 'sysadmin';
查看角色成员:
你可以查询 sys.server_role_members 和 sys.server_principals 视图。
-- 查询所有服务器角色及其成员
SELECT
r.name AS RoleName,
m.name AS MemberName,
m.type_desc AS MemberType
FROM
sys.server_role_members AS rm
JOIN
sys.server_principals AS r ON rm.role_principal_id = r.principal_id
JOIN
sys.server_principals AS m ON rm.member_principal_id = m.principal_id
ORDER BY
r.name, m.name;
用户定义的服务器角色 (SQL Server 2012+)
当固定服务器角色的权限过于宽泛(如 sysadmin)或过于具体(如 diskadmin)时,你可以创建自定义角色来精确匹配你的组织架构。
创建用户定义的服务器角色:
-- 创建一个名为 'AppAdmins' 的新服务器角色 CREATE SERVER ROLE AppAdmins;
向自定义角色添加权限:
使用 GRANT 语句授予服务器级别的权限。
-- 授予 'AppAdmins' 角色创建和连接数据库的权限 GRANT CREATE ANY DATABASE, CONNECT TO AppAdmins;
管理自定义角色的成员:
其成员管理方式与固定角色完全相同。
-- 将 'sql_login_user' 添加到 'AppAdmins' 角色 EXEC sp_addsrvrolemember @loginame = 'sql_login_user', @rolename = 'AppAdmins';
删除用户定义的服务器角色:
-- 删除 'AppAdmins' 角色 (角色必须为空) DROP SERVER ROLE AppAdmins;
最佳实践和注意事项
- 最小权限原则:只授予用户完成其工作所必需的最小权限,避免随意将用户添加到
sysadmin角色。 - 谨慎使用
public:public是一个“默认”角色,所有用户都是其成员,授予public的任何权限都会影响到所有用户,不要在public角色上授予敏感或高风险的权限。 - 使用用户定义角色进行精细化管理:对于需要特定服务器权限但又不适合固定角色的场景(只允许某个应用创建数据库),使用用户定义的角色是最好的选择。
- 区分服务器角色和数据库角色:不要混淆服务器角色和数据库角色(如
db_owner,db_datareader),服务器角色权限作用于整个 SQL Server 实例,而数据库角色权限作用于单个数据库内部。 - 审计成员身份:定期审查服务器角色的成员,确保没有不当的权限授予,特别是
sysadmin角色的成员。
| 特性 | 固定服务器角色 | 用户定义的服务器角色 |
|---|---|---|
| 定义者 | SQL Server 内置 | 数据库管理员创建 |
| 权限修改 | 不可修改 | 可以使用 GRANT, DENY, REVOKE 修改 |
| 角色删除 | 不可删除 | 可以使用 DROP SERVER ROLE 删除 |
| 主要用途 | 提供通用的、标准化的服务器管理权限 | 提供灵活的、可定制的服务器权限集合 |
理解并正确使用服务器角色是 SQL Server 安全管理和权限控制的基础,是每一位数据库管理员必备的技能。
