Почему хранимая процедура запускает несколько транзакций одновременно? Или пропускает шаги для выполнения? - PullRequest
0 голосов
/ 11 апреля 2019

У меня есть задание sql, которое выполняет хранимую процедуру с несколькими динамическими операторами sql.
Есть 3 шага:

  1. Отключение шифрования
  2. Удаление шифрования
  3. резервное копирование базы данных на целевой сервер

Когда я запускаю это задание, этот сценарий выполняется, но задание всегда завершается неудачей.
Я не получаю ошибки, если выполняю каждый оператор вручную.После некоторой попытки я смог выяснить, что Шаг 3 выполняется до того, как Шаг 2 будет завершен.Это создает копию базы данных на конечном сервере до того, как ключ дешифрования сбрасывается.

Как заставить SQL завершить процесс дешифрования до того, как будет инициирован следующий шаг?

Почему вторые транзакцииинициируется в той же базе данных, пока первый находится в процессе.Насколько я понимаю, база данных заблокирована до завершения одной транзакции.Я что-то упустил?

STEP 1: Turn off encryption

set @statement1 = 'ALTER DATABASE '+@db+'
     SET ENCRYPTION OFF;   
     WHILE NOT EXISTS
        (  
        SELECT encryption_state 
        FROM sys.dm_database_encryption_keys 
        where encryption_state = ''1'' 
        and database_id = (
                          select database_id 
                          from sys.databases 
                          where name ='''+@db+'''
                          )
        )
      BEGIN 
        WAITFOR DELAY ''00:00:30'' 
      END'

exec (@statement1);

STEP 2: Drop Encryption 

set @statement2 = 'IF EXISTS
        (SELECT encryption_state 
         FROM sys.dm_database_encryption_keys 
         where encryption_state = ''1'' 
         and database_id=
                    (select database_id 
                     from sys.databases 
                     where name ='''+@db+''')
         )
        use '+@db+'
        EXEC sp_changedbowner ''sa'';
        DROP DATABASE ENCRYPTION KEY;
               while exists 
                     (SELECT * FROM sys.dm_database_encryption_keys 
                      where database_id=
                           (select database_id 
                            from sys.databases where name 
                             ='''+@db+'''
                            )
                      )
                BEGIN
                WAITFOR DELAY ''00:00:30'' 
                END
  ELSE
    print ''Decryption Error'''
exec (@statement2);


Step 3: Copy decrypted database to different server

   set @statement3 = 'use master
   ALTER DATABASE '+@db+' SET RECOVERY simple;
   BACKUP DATABASE '+@db+'    
   TO DISK = ''\Shared_drive_Across_Servers\database.bak''
   WITH INIT, DESCRIPTION = N''DECRYPTED'', COMPRESSION
   WAITFOR DELAY ''00:00:50'';'

exec (@statement5);

1 Ответ

1 голос
/ 11 апреля 2019

Отсутствует начало и конец в среднем блоке и опечатка в последнем исполнении:

--STEP 1: Turn off encryption

set @statement1 = 'ALTER DATABASE '+@db+'
     SET ENCRYPTION OFF;   
     WHILE NOT EXISTS
        (  
        SELECT encryption_state 
        FROM sys.dm_database_encryption_keys 
        where encryption_state = ''1'' 
        and database_id = (
                          select database_id 
                          from sys.databases 
                          where name ='''+@db+'''
                          )
        )
      BEGIN 
        WAITFOR DELAY ''00:00:30'' 
      END'

exec (@statement1);

--STEP 2: Drop Encryption 

set @statement2 = 'IF EXISTS
                     (SELECT encryption_state 
                      FROM sys.dm_database_encryption_keys 
                      where encryption_state = ''1'' 
                      and database_id=
                         (
                          select database_id 
                          from sys.databases 
                          where name ='''+@db+'''
                         )
                 )
        BEGIN
        use '+@db+'
        EXEC sp_changedbowner ''sa'';
        DROP DATABASE ENCRYPTION KEY;
               while exists 
                     (SELECT * FROM sys.dm_database_encryption_keys 
                      where database_id=
                           (select database_id 
                            from sys.databases where name 
                             ='''+@db+'''
                            )
                      )
                BEGIN
                WAITFOR DELAY ''00:00:30'' 
                END
        END
  ELSE
    print ''Decryption Error'' '

exec (@statement2);


--Step 3: Copy decrypted database to different server

   set @statement3 = 'use master
   ALTER DATABASE '+@db+' SET RECOVERY simple;
   BACKUP DATABASE '+@db+'    
   TO DISK = ''\Shared_drive_Across_Servers\database.bak''
   WITH INIT, DESCRIPTION = N''DECRYPTED'', COMPRESSION
   WAITFOR DELAY ''00:00:50'';'

exec (@statement3);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...