Могу ли я использовать оператор удаления для удаления определенных участников из базы данных после завершения восстановления из Production in SQL Server? - PullRequest
0 голосов
/ 15 января 2019

У меня есть задача автоматизировать процесс взятия копии определенной производственной среды и использования файла .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
...