如何允许具有执行权限的只读登录名/用户运行删除并创建数据库的存储过程?

如何允许具有执行权限的只读登录名/用户运行删除并创建数据库的存储过程?

问题描述:

我有一个SQL Server 2016实例与工具数据库。 工具数据库有一个RestoreDBFromPath过程可以将备份文件还原到服务器上的数据库。如果数据库已经存在,它会删除数据库并恢复备份。恢复备份时,它还会将一些数据写入数据库的某些日志表中。如何允许具有执行权限的只读登录名/用户运行删除并创建数据库的存储过程?

调用示例:

USE [Tools] 
GO 

DECLARE @Path NVARCHAR(MAX), @DBName NVARCHAR(MAX) 

SET @Path = 'C:\Backups\Mybackup.bak' 
SET @DBName = 'RestoredDB' 


EXECUTE [dbo].[LoadDatabaseFromBackup] @Path, @DBName 
GO 

现在,我已经在服务器上2个登录:

  • 管理 - 系统管理员可以做任何事情
  • ReadOnlyUser - 可以查看任何数据库/定义在服务器上以及连接到任何数据库

个工具数据库具有1个用户(管理员可以自一个系统管理员连接):

  • ReadOnlyUser - 可以查看任何定义,从在任何表格读取,并在工具数据库执行RestoreDBFromPath

如果我执行RestoreDBFromPath步骤,同时登录的管理员,然后一切工作正常。然而,试图将其作为ReadOnlyUser运行会导致它失败,因为该用户无法写入工具上的表,并且它尤其不能在服务器上删除/创建/恢复数据库。

什么是简单和安全的方式,我可以允许ReadOnlyUser执行RestoreDBFromPath就像Admin可以成功?

事情我已经尝试:

  • 更改SP签名CREATE PROCEDURE dbo.RestoreDBFromPath @Path NVARCHAR(MAX), @DBName NVARCHAR(MAX) WITH EXECUTE AS OWNER
  • 没有登录在工具创建用户数据库具有完全权限,并设置SP执行作为他们

我试过的东西,但可能没有正确完成:

  • 通过密码的证明书上工具,创建从证书的用户,因为用户完全权限,与证书签署了RestoreDBFromPath SP

事情我听说过,但没有发现很好的例子:

  • 使用的不对称密钥
+0

为什么在这个世界上,你想允许一个只读的用户删除现有的数据库并覆盖它们?那可怕的过程设计的尖叫。 –

+0

RestoreDBFromPath过程中有很多约束条件可以保证“安全”。此过程允许用户以受控方式恢复数据库,而不是授予用户完全权限,以便通过手动进行恢复来破坏破坏。 – Chris

+0

是不是这是'作为所有者'执行的目的?现在,当所有者为'dbo'时(因为该用户通常没有drop/create db privs),它可能不起作用,但是如果您拥有作为dbcreator角色一部分的用户的所有者,似乎它应该工作你想要的。 – SlimsGhost

为了使ReadOnlyUser执行存储过程在工具数据库中, - 他需要具有对存储过程的执行权限

对于在服务器上删除和创建任何数据库,ReadOnlyUser需要是服务器上的dbCreator。 (缺点是他/她可以删除任何数据库)。

为了写入Tools数据库中的日志表,向日志表上的ReadOnlyUser授予写入权限。

+0

但是,有没有一种方法可以让存储过程本身的权限或创建一个专用的用户具有权限,只能在过程中使用? – Chris