У меня есть задача автоматизировать процесс взятия копии определенной производственной среды и использования файла .bak
для восстановления другой среды (TEST или DEV), чтобы они не оказались не синхронизированными.Я понимаю, что это не совсем лучшая практика, но сейчас это лучшее решение для проблемы, которую мы решаем.
Я, очевидно, не хочу сохранять принципы / роли / разрешения, которые есть в моей среде Prodв моей тестовой среде, и поэтому я ищу способ удалить принципы и затем вернуть исходные тестовые.
Я нашел здесь пример Кеннета Фишера . Однако яИнтересно, не слишком ли это решение спроектировано для моих целей?
Есть ли причина, по которой я не должен просто использовать скрипт, подобный приведенному ниже, чтобы точно удалить, какие принципы мне нужны, из восстановленного тестового файла, а затем использовать Mr?Сценарий Фишера, чтобы вернуть старых принципалов?
DECLARE @sql AS NVARCHAR(500)
DECLARE @name sysname
DECLARE cursor_name CURSOR FAST_FORWARD READ_ONLY FOR
SELECT name
FROM sys.database_principals
WHERE [type] in (N'U',N'S',N'G')
AND name NOT IN ('dbo', 'guest', 'INFORMATION_SCHEMA', 'sys', 'public', 'codaprod_user', 'NT SERVICE\HealthService')
OPEN cursor_name
FETCH NEXT FROM cursor_name INTO @name
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = N'IF EXISTS (SELECT TOP 1 1 FROM sys.schemas WHERE [name] = ''' + @name + ''')
BEGIN
DROP SCHEMA [' + @name + N']
END
BEGIN TRY
DROP USER [' + @name + N']
END TRY
BEGIN CATCH END CATCH;'
--PRINT 'USE ' + DB_NAME() + ';' + @sql
EXEC sys.sp_executesql @sql
FETCH NEXT FROM cursor_name INTO @name
END
CLOSE cursor_name
DEALLOCATE cursor_name;
GO