任何人都可以解释为什么SINGLE_USER模式可能导致我的升级脚本失败?

时间:2014-05-07 15:47:47

标签: sql sql-server database build-automation bamboo

我正在进行自动部署,需要确保在数据库升级期间没有其他活动连接。最初我在运行升级脚本之前重新启动SQL服务器,但我知道这是一个相当沉重的方法。

所以我使用预部署脚本将以下内容添加到每次升级的开头:

ALTER DATABASE XXXXX SET SINGLE_USER WITH ROLLBACK IMMEDIATE

我已经使用部署后脚本在每次升级结束时添加以下内容:

ALTER DATABASE XXXXX SET MULTI_USER WITH ROLLBACK IMMEDIATE

这似乎非常受欢迎。它对一个测试服务器运行良好,但在另一个测试服务器上运行失败,出现以下错误:

  

数据库'XYZ'已经打开,一次只能有一个用户。

一旦它碰到升级脚本中的以下行,就会出现此错误,该行在39884行显示大约一半(这是第一次在脚本中显示):

SET QUOTED_IDENTIFIER ON;

我对SINGLE_USER模式的理解是,它会杀死与数据库的其他连接,同时保持运行升级脚本的连接处于活动状态 - 并且它将阻止任何进一步的连接,直到恢复MULTI_USER模式。

如果是这种情况,是否有人知道为什么它会在运行脚本的过程中突然阻止连接?

更新1

我刚刚在本地运行升级脚本而没有任何问题,因此该问题与SET QUOTED_IDENTIFIER ON语句无关。我认为这取决于时机和联系。我仍然不理解错误,因为这个脚本都是作为同一连接的一部分运行的。

更新2

我再次运行脚本,并且我也使用了与其他数据库升级脚本相同的方法,并且它不会再次发生。所以这将是另一天可能会或可能不会再困扰我的潜在问题之一!

更新3

我没有设法收集这种行为的解释,并且它会在某些部署期间浮出水面,但不会在其他部署中出现。最后,我完全删除了SINGLE_USER开关,并在没有它的情况下运行升级。

0 个答案:

没有答案