我正在运行一堆数据库迁移脚本。我发现自己有一个相当紧迫的问题,即业务正在醒来,并期望看到他们的数据,他们的数据还没有完成迁移。我还将应用程序脱机,他们确实需要重新启动。实际上“业务”是许多公司,因此我在一个查询窗口中有许多运行SP的脚本,如下所示:
EXEC [dbo].[MigrateCompanyById] 34
GO
EXEC [dbo].[MigrateCompanyById] 75
GO
EXEC [dbo].[MigrateCompanyById] 12
GO
EXEC [dbo].[MigrateCompanyById] 66
GO
每个SP都会调用大量其他子SP来迁移所需的所有数据。我正在考虑取消查询,但我不确定执行将在什么时候取消。如果它在下一个GO取消很好,那么我会很高兴。如果它在公司迁移中途取消,那我就搞砸了。
如果我无法取消,我可以更改MigrateCompanyById SP并注释所有子SP呼叫吗?这会阻止下一个运行,同时完成当前正在运行的那个吗?
有什么想法吗?
答案 0 :(得分:0)
实现受控取消的一种方法是添加包含取消标记的表。您可以在取消优惠时设置此标志,并且您的SP可以定期检查并在适当时停止执行。
答案 1 :(得分:0)
无论如何我被迫取消了剧本。
这样做时,我注意到它在当前执行语句之后取消,无论它在SP执行链中的什么位置。
答案 2 :(得分:0)
您是否将每个迁移存储过程中的代码包含在事务处理(BEGIN,COMMIT等)中?这将使您能够相对轻松地回滚更改,具体取决于您在过程中执行的操作。
我见过一个解决方案,你有一个表,其中一个记录的位值为0或1,如果该记录为0,你的生产应用程序不允许用户访问,使你可以做任何你需要的事情在任务完成后将该标志设置为1,以使生产继续。根据您的环境,这可能不实用,但可以确保没有用户会通过您的应用程序搞乱您的数据,直到您认为它已经准备好被搞乱为止。
答案 3 :(得分:0)
您可以使用this method报告脚本的执行进度。 你现在拥有它的方式是每个sproc都是它自己的交易。因此,如果您取消脚本,您将只获得部分更新,直到最后一次成功执行的程序。
但是,如果您需要全部或不需要更新,那么您可以将其全部置于单一交易中。