У меня есть задание sql, которое выполняет хранимую процедуру с несколькими динамическими операторами sql.
Есть 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);