凌峰创科服务平台

sql server 服务器角色

什么是服务器角色?

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

sql server 服务器角色-图1
(图片来源网络,侵删)

将一个登录账户添加到某个服务器角色中,就相当于授予了该角色所包含的所有权限,这是一种高效、批量管理服务器级权限的方式。


两种类型的服务器角色

SQL Server 提供了两类服务器角色:

  1. 固定服务器角色:由 SQL Server 预先定义,其权限和成员关系不能被修改,你不能添加新的权限,也不能从固定角色中删除其内置的权限,这是最常用、最核心的服务器角色。
  2. 用户定义的服务器角色:从 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 服务器角色-图2
(图片来源网络,侵删)

使用 SQL Server Management Studio (SSMS)

这是最直观的方式。

  1. 对象资源管理器 中,展开服务器实例。
  2. 展开 “安全性” 文件夹。
  3. 展开 “服务器角色” 文件夹。
  4. 右键单击你想要修改的角色(dbcreator),然后选择 “属性”
  5. 在弹出的窗口中,点击 “添加”“删除” 按钮来添加或移除登录账户。
  6. 点击 “确定” 保存更改。

使用 Transact-SQL (T-SQL)

这是更灵活、更适用于自动化脚本的方式。

添加成员:

使用 sp_addsrvrolemember 存储过程。

sql server 服务器角色-图3
(图片来源网络,侵删)
-- 将 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_memberssys.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;

最佳实践和注意事项

  1. 最小权限原则:只授予用户完成其工作所必需的最小权限,避免随意将用户添加到 sysadmin 角色。
  2. 谨慎使用 publicpublic 是一个“默认”角色,所有用户都是其成员,授予 public 的任何权限都会影响到所有用户,不要在 public 角色上授予敏感或高风险的权限。
  3. 使用用户定义角色进行精细化管理:对于需要特定服务器权限但又不适合固定角色的场景(只允许某个应用创建数据库),使用用户定义的角色是最好的选择。
  4. 区分服务器角色和数据库角色:不要混淆服务器角色和数据库角色(如 db_owner, db_datareader),服务器角色权限作用于整个 SQL Server 实例,而数据库角色权限作用于单个数据库内部。
  5. 审计成员身份:定期审查服务器角色的成员,确保没有不当的权限授予,特别是 sysadmin 角色的成员。
特性 固定服务器角色 用户定义的服务器角色
定义者 SQL Server 内置 数据库管理员创建
权限修改 不可修改 可以使用 GRANT, DENY, REVOKE 修改
角色删除 不可删除 可以使用 DROP SERVER ROLE 删除
主要用途 提供通用的、标准化的服务器管理权限 提供灵活的、可定制的服务器权限集合

理解并正确使用服务器角色是 SQL Server 安全管理和权限控制的基础,是每一位数据库管理员必备的技能。

分享:
扫描分享到社交APP
上一篇
下一篇