У меня на одном сервере базы данных из разных проектов. Я не могу дать всем разработчикам административные (sysadmin
) доступ к базам данных. У них должны быть разрешения, необходимые для создания и восстановления баз данных. В dbcreator
роль сервера вполне подходит для этого. Другими словами, пользователи, восстанавливающие резервные копии, имеют dbcreator
но нет sysadmin
.
К сожалению, поскольку большая часть восстановленных резервных копий поступает не с того же сервера, на котором они восстанавливаются, пользователи, восстанавливающие резервные копии, немедленно теряют доступ к базе данных, которую они только что восстановили.
Как они могут восстановить базу данных, чтобы пользователь, восстановивший базу данных из резервной копии, автоматически добавлялся в dbowner
роль базы данных? Какие изменения необходимы в SQL Server, чтобы это стало возможным?
Обновление: я попытался добавить триггер на INSERT в [dbo].[restorehistory]
, но чтобы добавить роль с помощью sp_addrolemember
требует use [database]
работать, и этот оператор в триггере недопустим. Я также читал, что триггеры на restorehistory
не запускаться вообще после импорта базы данных (поскольку это системная таблица).
Вы можете обойти проблему:
Поэтому разработчикам просто нужно поместить файл резервной копии в общую папку, чтобы восстановить его, даже без прав dbcreator.
Если вам интересно, я могу предоставить пример сценария PowerShell для восстановления базы данных (и, например, изменения пути по мере необходимости).
Если ваши источники достаточно стандартны, вы можете создать хранимую процедуру, которую может запускать только эта роль, которая принимает в качестве аргументов файл восстановления, новое имя базы данных и идентификатор пользователя. Пусть один SP восстановит БД, а затем изменит права доступа.
После такой настройки вы, вероятно, можете перестать предоставлять пользователям роль dbcreator и просто запустить SP как системный администратор. Просто предоставьте привилегированным пользователям права на SP (или роль / схему, которая включает этот SP) и попросите его проверить работоспособность и заключить аргументы в скобки.
Поскольку вы уже используете PowerShell, у вас есть логика восстановления. Просто переместите большую часть его в SQL и пусть сценарий PowerShell соберет аргументы, а затем вызовет SP.