我有一个计划任务,它每晚运行一次,将现有的生产 Azure SQL 数据库复制到开发环境。复制后,我会缩小数据库的规模(实际上我将其放入弹性池中,以在多个其他数据库之间分摊成本),以降低成本,因为它不再用于生产,仅用于开发工作负载。这真的很容易做到,只需使用 TSQL 的一行代码:
ALTER DATABASE [newly-copied-db] MODIFY ( SERVICE_OBJECTIVE = ELASTIC_POOL ( name = [my-elastic-pool] ) );
此命令是异步的。它会立即返回
命令已成功完成。
实际上,将数据库移入弹性池可能需要一些时间。
我遇到的问题是弹性池分配的空间有限。如果由于我使用了太多空间而导致扩展操作失败,我需要知道。此外,如果知道作业已成功完成,那么我可以触发一些通知,那就太好了。
如何判断扩展操作是否失败(或者是否成功)?
理想情况下是通过事件/回调类型机制而不是轮询
答案1
尝试类似这样的方法dm_operation_status 动态管理窗口:
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