У меня есть запланированная задача, которая запускается каждую ночь, чтобы скопировать существующую производственную базу данных SQL Azure в среду разработки. После копирования я масштабирую базу данных вниз (на самом деле я помещаю ее в эластичный пул, чтобы разделить стоимость между несколькими другими базами данных), чтобы снизить затраты, поскольку она больше не находится в производстве и используется только для рабочих нагрузок разработчиков. Это действительно легко сделать с однострочником, используя TSQL:
ALTER DATABASE [newly-copied-db] MODIFY ( SERVICE_OBJECTIVE = ELASTIC_POOL ( name = [my-elastic-pool] ) );
Это асинхронная команда. Возвращается сразу с
Команды успешно выполнены.
На самом деле перемещение db в эластичный пул может занять некоторое время.
Проблема, с которой я столкнулся, заключается в том, что эластичный пул имеет ограниченное количество выделенного пространства. Если операция масштабирования не удалась из-за того, что я использую слишком много места, мне нужно знать. Кроме того, было бы здорово узнать, что задание выполнено успешно, чтобы я мог вызвать какое-нибудь уведомление.
В идеале через механизм типа события / обратного вызова, а не опрос
Попробуйте что-нибудь подобное на основе dm_operation_status DMV:
while (
select top 1 state_desc
from sys.dm_operation_status
WHERE resource_type_desc = 'Database'
AND major_resource_id = @db
AND operation = 'ALTER DATABASE'
order by start_time desc
) in ('PENDING', 'IN_PROGRESS')
begin
print 'waiting for operation to complete: ' + convert(varchar,getdate(),120);
waitfor delay '00:00:30';
end
while (
select top 1 state_desc
from sys.dm_operation_status
WHERE resource_type_desc = 'Database'
AND major_resource_id = @db
AND operation = 'ALTER DATABASE'
order by start_time desc
) in ('COMPLETE')
begin
print 'complete!';
end
else
begin
print 'failed!';
end