为了帮助管理数据库级别的安全性,SQL Server具有数据库角色。就像服务器角色一样,也有两种不同类型的数据库角色:固定的和用户定义的。固定的数据库角色就像固定的服务器角色一样,这意味着它们拥有一组特定的权限,这些权限不能被更改。
固定的数据库角色只提供对特定数据库中的数据库资源的权限。如果数据库用户是固定数据库角色的成员,则它们继承为固定数据库角色预定义的权限。每个数据库包含相同的固定数据库角色集。表2包含每个固定数据库角色定义的名称和定义,如Microsoft文档中所示。
Table 2: 固定数据库角色
名称 | 成员权限描述 |
---|---|
db_owner | 可以对数据库执行所有的配置和维护活动,也可以在SQL Server中删除数据库。(在SQL Database和Azure Synapse中,一些维护活动需要服务器级别的权限,不能由db_owner执行。) |
db_securityadmin | 只能修改自定义角色的角色成员关系和管理权限。这个角色的成员可以潜在地提升他们的特权,他们的行为被监视。 |
db_accessadmin | 可以为Windows登录用户、Windows组和SQL Server登录用户添加或删除对数据库的访问。 |
db_backupoperator | 可以备份数据库 |
db_ddladmin | 可以在数据库中运行任何DDL命令。 |
db_datawriter | 增加、删除或者改变数据,在用户的表里面的 |
db_datareader | 读取所有用户的表数据 |
db_denydatawriter | 不能添加、修改或删除数据库中用户表中的任何数据。 |
db_denydatareader | 不能读取数据库中用户表中的任何数据。 |
就像固定的服务器角色一样,可以使用许多系统存储过程、命令、视图和函数来显示和管理固定的数据库角色。清单4中的代码展示了如何使用这些系统存储过程sp_dbfixedrolepermission之一,显示与每个固定数据库角色相关联的所有权限在AdventureWorks2019数据库中,以及如何使用该存储过程显示的权限与单一db_datareader固定数据库角色。
Listing 4: 展示固定数据角色权限
USE AdventureWorks2019; GO -- Show all permissions for fix database roles EXEC sp_dbfixedrolepermission; GO --Show permissions for db_datareader EXEC sp_dbfixedrolepermission @rolename = 'db_datareader'; |
---|
为了让数据库用户继承固定数据库角色的权限,他们需要是固定数据库角色的成员。要确定数据库用户是否为数据库角色的成员,可以使用SSMS检查角色成员关系,具体步骤如下
Figure 2 展示db_datareader
角色:
Figure 2:检查固定的数据库角色权限
应用程序可能需要以编程方式确定数据库用户是否是角色的成员。IS_MEMBER函数允许您编写TSQL代码来实现这一点。使用此函数将允许您构建一个应用程序,该应用程序根据当前用户的数据库角色为不同的数据库用户显示不同的菜单选项。以编程方式确定当前登录的数据库用户是否为db_datawriter角色的成员
Listing 5:
USE AdventureWorks2019;
GO
SELECT IS_MEMBER('db_datawriter');
GO
如果当前用户是db_datawriter角色的成员,则IS_MEMBER函数返回1;如果用户不是该角色的成员,则返回0。
SQL server中提供了几种预定义的服务器角色和数据库角色。这些预定义的角色为成员提供了一组基于角色的固定权限。通过使用这些预定义的角色,只需将登录用户或数据库用户设置为服务器或数据库角色的成员,就可以轻松地向他们授予对一组预定义权限的访问权限。在使用固定的服务器和数据库角色时要记住的一件事是,权限不能更改或扩展。使用预定义的服务器和数据库角色是一种极好的方式,可以通过最少的管理工作提供一组对服务器和/或数据库资源的固定访问。