仅创建、恢复、删除部分数据库的 SQL Server 权限

dri*_*zzt 17 sql-server-2008 sql-server

在 MS SQL Server 2008 R2 上,我需要有可以创建、还原、DBCC CHECKDB 然后删除数据库的用户。但他一定不能访问或删除服务器上的指定数据库(安全原因)。这个设置可以吗?

Mik*_*lsh 27

是的,可以通过几个权限。

首先 - 创建一个数据库- 您需要授予服务器级别的权限Create Any Database。这个权限就像听起来一样 - 创建数据库的能力。请注意,并未将 dbcreator 的固定服务器角色授予登录名,因为该固定服务器角色授予对任何数据库的更改/删除权限。Create Any Database仅允许登录名拥有对他们拥有的数据库的权力。这也将提供恢复的能力。

(因此,通过执行“创建任何数据库” - 您就可以创建新数据库,但避免删除或更改通过使用 dbcreator 固定服务器角色获得的任何数据库的能力)

要授予此“创建任何数据库”权限 -

use [master]
GO
GRANT CREATE ANY DATABASE TO [LoginName]
GO
Run Code Online (Sandbox Code Playgroud)

对于运行DBCC CHECKDB和删除数据库的能力- 固定数据库角色 db_owner 就足够了。这将授予您所请求的所有内容。请注意:您还授予此用户选择、删除、截断、更新和插入的能力db_owner。我喜欢将其视为sysadmin在数据库中。

您只会将此权限应用于您打算拥有此功能的数据库。这将允许您控制用户可以删除、恢复或检查哪些数据库。您没有授予用户这些权限的任何数据库都不会受到该用户执行这些操作的影响

为此,您首先将登录映射到数据库用户:

USE [DatabaseName]
GO
CREATE USER [UserName] FOR LOGIN [LoginName] 
GO
Run Code Online (Sandbox Code Playgroud)

然后将该用户添加到db_owner角色(适用于 SQL Server 2012 及更高版本):

ALTER ROLE [db_owner] ADD MEMBER [frank]
GO
Run Code Online (Sandbox Code Playgroud)

对于 SQL Server 2008,您必须使用系统存储过程添加角色成员作为下面正确指出的评论者:

EXEC sp_addrolemember 'db_owner', 'frank';
Run Code Online (Sandbox Code Playgroud)

您还可以通过 GUI 完成所有这些操作。您将在实例级别通过 SSMS 中的安全文件夹执行的登录信息:右键单击登录 -> 属性 -> Securables。对于数据库级别,您可以通过数据库级​​别的安全文件夹执行此操作:右键单击并选择新用户 -> 从服务器登录名列表中选择您希望使用的登录名/为数据库用户命名 -> 转到成员资格选项卡以选择角色成员资格。

SQL Server 的帮助系统 Books Online 也是解决大多数权限问题的绝佳资源 - 如果您确定需要分配其他权限。只需搜索您希望授予权限的 T-SQL 命令,文章中通常会有该命令的权限部分,让您了解执行此操作所需的权限。您可以查看DBCC CHECKDB的文章以获取示例 - 文章下方的大约 7/8 部分是权限部分。

  • 我只想补充一点,`ALTER ROLE [db_owner] ADD MEMBER [frank]` 仅适用于 SQL Server 2012。如果您使用的是 SQL Server 2008,则应该使用 SP:`EXEC sp_addrolemember 'db_owner', 'frank ';`(参考 [此处](http://social.msdn.microsoft.com/Forums/en-US/sqlsecurity/thread/4669c506-8442-4e76-a64f-1269e5394cd3/)和 [此处](http:// /stackoverflow.com/questions/7479227/give-asp-net-mvc-app-permission-to-drop-and-create-sql-server-database)) (3认同)