数据库级别角色

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsAnalytics Platform System (PDW)

为便于管理数据库中的权限,SQL Server 提供了若干角色,这些角色是用于对其他主体进行分组的安全主体。 它们类似于 Microsoft Windows 操作系统中的“组”。 数据库级角色的权限作用域为数据库范围。

若要向数据库角色添加和删除成员,请使用 ADD MEMBER ALTER ROLE DROP MEMBER 语句的 选项。 Analytics Platform System (PDW) 和 Azure Synapse Analytics 不支持使用 ALTER ROLE. 改为使用较早版本的 sp_addrolemembersp_droprolemember 过程。

存在两种类型的数据库级角色:数据库中预定义的“固定数据库角色”和可以创建的“用户定义的数据库角色”

固定数据库角色是在数据库级别定义的,并且存在于每个数据库中。 db_owner 数据库角色的成员可以管理固定数据库角色成员身份。 msdb 数据库中还有一些特殊用途的数据库角色。

可以向数据库级角色中添加任何数据库帐户和其他 SQL Server 角色。

提示

请不要将用户定义的数据库角色添加为固定角色的成员。 这会导致意外的权限升级。

可以使用 GRANTDENYREVOKE 语句自定义用户定义数据库角色的权限。 有关详细信息,请参阅 权限(数据库引擎)

有关所有权限的列表,请参阅 数据库引擎权限 招贴。 不能向数据库角色授予服务器级别权限。 不能向数据库角色添加登录名和其他服务器级别主体(如服务器角色)。 对于 SQL Server 中的服务器级别安全性,请改为使用服务器角色。 不能通过 Azure SQL 数据库 和 Azure Synapse Analytics 中的角色授予服务器级别权限。

固定数据库角色

下表显示了固定数据库角色及其能够执行的操作。 所有数据库中都有这些角色。 无法更改分配给固定数据库角色的权限,public 数据库角色除外

固定数据库角色名 说明
db_owner db_owner 固定数据库角色的成员可以执行数据库的所有配置和维护活动,还可以 drop SQL Server 中的数据库。 (在 SQL 数据库 和 Synapse Analytics 中,某些维护活动需要服务器级别权限,并且不能由 db_owners 执行。)
db_securityadmin db_securityadmin 固定数据库角色的成员可以仅修改自定义角色的角色成员资格和管理权限。 此角色的成员可能会提升其权限,应监视其操作。
db_accessadmin db_accessadmin 固定数据库角色的成员可以为 Windows 登录名、Windows 组和 SQL Server 登录名添加或删除数据库访问权限。
db_backupoperator db_backupoperator 固定数据库角色的成员可以备份数据库。
db_ddladmin db_ddladmin 固定数据库角色的成员可以在数据库中运行任何数据定义语言 (DDL) 命令。 此角色的成员可以通过操作可能以高特权执行的代码来提升其特权,其操作应被监视。
db_datawriter db_datawriter 固定数据库角色的成员可以在所有用户表中添加、删除或更改数据。 在大多数用例下,此角色将与 db_datareader 成员身份一起使用,以允许读取要修改的数据。
db_datareader db_datareader 固定数据库角色的成员可以从所有用户表和视图中读取所有数据。 用户对象可能存在于除 sys 和 INFORMATION_SCHEMA 以外的任何架构中
db_denydatawriter db_denydatawriter 固定数据库角色的成员不能添加、修改或删除数据库内用户表中的任何数据。
db_denydatareader db_denydatareader 固定数据库角色的成员不能读取数据库内用户表和视图中的任何数据

无法更改分配给固定数据库角色的权限。 下图显示了分配给固定数据库角色的权限:

fixed_database_role_permissions

SQL 数据库 和 Azure Synapse 的特殊角色

这些数据库角色仅存在于虚拟 master 数据库中。 他们的权限仅限于在 master 中执行的操作。 只能向这些角色添加 master 中的数据库用户。 无法向这些角色添加登录名,但可以基于登录名创建用户,然后向角色添加用户。 也可以向这些角色添加 master 中包含的数据库用户。 不过,如果向 master 中的 dbmanager 角色添加包含的数据库用户,这些用户无法用于新建数据库。

角色名称 说明
dbmanager 可以创建和删除数据库。 创建数据库的 dbmanager 角色的成员成为相应数据库的所有者,这样可便于用户以 dbo 用户身份连接到相应数据库。 Dbo 用户具有数据库中的所有数据库权限。 dbmanager 角色的成员不一定具有访问非他们所有的数据库的权限。
db_exporter 仅适用于 Azure Synapse Analytics 专用 SQL 池(以前称为 SQL DW)。
db_exporter 固定数据库角色的成员可以执行所有数据导出活动。 通过此角色授予的权限是创建表、更改任何架构、更改任何外部数据源、更改任何外部文件格式。
loginmanager 可以创建和删除虚拟 master 数据库中的登录名。

注意

服务器级别主体和 Microsoft Entra 管理员(如果已配置)具有 SQL 数据库和 Azure Synapse Analytics 中的所有权限,且无需成为任何角色的成员。 有关详细信息,请参阅 SQL 数据库身份验证和授权:授予访问权限

部分数据库角色不适用于 Azure SQL 或 Azure Synapse:

  • db_backupoperator 不适用于 Azure SQL 数据库(非 Azure SQL 托管实例)和 Azure Synapse Analytics 无服务器池,因为 T-SQL 备份和还原命令不可用
  • db_datawriter 和 db_denydatawriter 不适用于 Azure Synapse Analytics 无服务器,因为它只读取外部数据

msdb 角色

msdb 数据库中包含下表显示的特殊用途的角色。

msdb 角色名称 说明
db_ssisadmin

db_ssisoperator

db_ssisltduser
这些数据库角色的成员可以管理和使用 SSIS。 从早期版本升级的 SQL Server 实例可能包含使用 Data Transformation Services (DTS)(而不是 SSIS)命名的旧版本角色。 有关详细信息,请参阅 Integration Services 角色(SSIS 服务)
dc_admin

dc_operator

dc_proxy
这些数据库角色的成员可以管理和使用数据收集器。 有关详细信息,请参阅 Data Collection
PolicyAdministratorRole db_ PolicyAdministratorRole 数据库角色的成员可以对基于策略的管理策略和条件执行所有配置和维护活动。 有关详细信息,请参阅 使用基于策略的管理来管理服务器
ServerGroupAdministratorRole

ServerGroupReaderRole
这些数据库角色的成员可以管理和使用注册的服务器组。
dbm_monitor 在数据库镜像监视器中注册第一个数据库时在 msdb 数据库中创建。 在系统管理员为 dbm_monitor 角色分配用户之前,该角色没有任何成员。

重要

db_ssisadmin 角色和 dc_admin 角色的成员可以将其特权提升为 sysadmin。 因为这些角色可以修改 Integration Services 包,而 Integration Services 使用 SQL Server 代理的 sysadmin 安全上下文可以执行 SQL Server 包,所以可以实现特权提升。 若要在运行维护计划、数据收集组和其他 Integration Services 包时防止此权限提升,请将运行包的 SQL Server 代理作业配置为使用具有有限权限的代理帐户,或只将 sysadmin 成员添加到 db_ssisadmin 和 dc_admin 角色。

使用数据库级角色

下表说明了用于数据库级角色的命令、视图和函数。

功能 类型 描述
sp_helpdbfixedrole (Transact-SQL) 元数据 返回固定数据库角色的列表。
sp_dbfixedrolepermission (Transact-SQL) 元数据 显示固定数据库角色的权限。
sp_helprole (Transact-SQL) 元数据 返回当前数据库中有关角色的信息。
sp_helprolemember (Transact-SQL) 元数据 返回有关当前数据库中某个角色的成员的信息。
sys.database_role_members (Transact-SQL) 元数据 为每个数据库角色的每个成员返回一行。
IS_MEMBER (Transact-SQL) 元数据 指示当前用户是否为指定 Microsoft Windows 组、Microsoft Entra 组或 Microsoft SQL Server 数据库角色的成员。
CREATE ROLE (Transact-SQL) 命令 在当前数据库中创建新的数据库角色。
ALTER ROLE (Transact-SQL) 命令 更改数据库角色的名称或成员身份。
DROP ROLE (Transact-SQL) 命令 从数据库中删除角色。
sp_addrole (Transact-SQL) 命令 在当前数据库中创建新的数据库角色。
sp_droprole (Transact-SQL) 命令 从当前数据库中删除数据库角色。
sp_addrolemember (Transact-SQL) 命令 为当前数据库中的数据库角色添加数据库用户、数据库角色、Windows 登录名或 Windows 组。 Analytics Platform System (PDW) 和 Azure Synapse 以外的所有平台都应改用 ALTER ROLE
sp_droprolemember (Transact-SQL) 命令 从当前数据库的 SQL Server 角色中删除安全帐户。 Analytics Platform System (PDW) 和 Azure Synapse 以外的所有平台都应改用 ALTER ROLE
GRANT 权限 向角色添加权限。
DENY 权限 拒绝向角色授予权限。
REVOKE 权限 撤消以前授予或拒绝的权限。

public 数据库角色

每个数据库用户都属于 public 数据库角色。 如果未向某个用户授予或拒绝对安全对象的特定权限时,该用户将继承授予该对象的 public 角色的权限。 无法将数据库用户从 public 角色删除。

示例

本节中的示例展示了如何使用数据库级角色。

A. 将用户添加到数据库级角色

下面的示例将用户“Ben”添加到固定数据库级角色 db_datareader

ALTER ROLE db_datareader
	ADD MEMBER Ben;  
GO

B. 列出作为数据库级别角色成员的所有数据库主体

下面的语句将返回任何数据库角色的所有成员。

SELECT    roles.principal_id                            AS RolePrincipalID
    ,    roles.name                                    AS RolePrincipalName
    ,    database_role_members.member_principal_id    AS MemberPrincipalID
    ,    members.name                                AS MemberPrincipalName
FROM sys.database_role_members AS database_role_members  
JOIN sys.database_principals AS roles  
    ON database_role_members.role_principal_id = roles.principal_id  
JOIN sys.database_principals AS members  
    ON database_role_members.member_principal_id = members.principal_id;  
GO