SQL 服务器更改数据库并立即回滚

SQL Server alter database with rollback immediate

有时(例如)通过执行以下命令将数据库设置为离线时,会抛出异常,因为连接了一个或多个客户端:

ALTER DATABASE <dbname> SET OFFLINE

根据this answer,一种解决方案是在末尾使用with rollback immediate

ALTER DATABASE <dbname> SET OFFLINE WITH ROLLBACK IMMEDIATE

为什么这实际上会断开其他客户端的连接?这听起来像是一种非常不明显的强制断开连接的方法,尽管它确实有效。

来自MSDN

WITH <终止>::=

Specifies when to roll back incomplete transactions when the database is transitioned from one state to another. If the termination clause is omitted, the ALTER DATABASE statement waits indefinitely if there is any lock on the database. Only one termination clause can be specified, and it follows the SET clauses.

在你的情况下 ROLLBACK IMMEDIATE 终止。

当其他用户在其上有交易 运行 时,您不能使数据库脱机,因此您将不得不以某种方式断开用户的连接以使数据库脱机。

如果你有礼貌,你可以要求所有用户在你使数据库脱机之前完成他们正在做的事情

但如果这不可行,包括选项

WITH ROLLBACK IMMEDIATE

表示所有当前事务都被回滚(数据库重置为事务开始的点)。你也可以使用

WITH ROLLBACK AFTER 60 SECONDS

但我从来没有

如果您可以在有未完成的事务时使数据库脱机 运行,那么数据库将处于不稳定状态,既没有进行更改也没有取消更改