我在一台服务器上有来自不同项目的数据库。我无法授予所有开发人员sysadmin
对数据库的管理 () 访问权限。他们必须拥有创建和恢复数据库所需的权限。dbcreator
服务器角色可以很好地完成此任务。换句话说,恢复备份的用户有dbcreator
但没有sysadmin
。
不幸的是,由于大多数恢复的备份不是来自恢复它们的同一台服务器,恢复备份的用户会立即失去对刚刚恢复的数据库的访问权限。
他们如何恢复数据库,以便从备份中恢复数据库的用户自动添加到dbowner
数据库角色? SQL Server 需要进行哪些更改才能实现这一点?
更新:我尝试在 INSERT 上添加触发器[dbo].[restorehistory]
,但使用sp_addrolemember
需要添加角色use [database]
才能工作,并且此语句在触发器中是非法的。我还读到,restorehistory
在数据库导入后,触发器根本不会触发(因为它是一个系统表)。
答案1
您可以通过以下方式解决该问题:
- 创建文件夹来托管 SQL 备份
- 创建一个脚本(例如 powershell 脚本),当它在文件夹中找到备份时自动恢复到数据库,应用安全性,然后将备份移动到存档文件夹。然后在完成后发送邮件。
- 创建每分钟运行一次的计划任务。
因此开发人员只需将备份文件放在共享文件夹上即可恢复它,甚至不需要 dbcreator 权限。
如果您有兴趣,我可以提供一个 powershell 脚本示例来恢复数据库(例如根据需要更改路径)。
答案2
如果您的源相当标准,您可以创建一个只有该角色可以运行的存储过程,该过程以恢复文件、新数据库名称和用户 ID 作为参数。让一个 SP 恢复数据库,然后进行权限更改。
通过这样的设置,您可能可以停止为用户提供 dbcreator 角色,而只需以 sysadmin 身份运行 SP。只需将特权用户权限授予 SP(或包含该 SP 的角色/架构),然后进行健全性检查并括住参数。
由于您已经在使用 powershell,因此您已经弄清楚了恢复的逻辑。只需将大部分内容移至 SQL,然后让 powershell 脚本收集参数,然后调用 SP。