如何返回 multi_user 模式
How do I go back to multi_user mode
这是我的查询:
IF EXISTS(%some query%)
BEGIN
BEGIN TRY
ALTER DATABASE [MyDatabase] SET single_user WITH ROLLBACK IMMEDIATE;
--do something
--throw some exception
END TRY
BEGIN CATCH
--here I want to set database back to multi_user
RAISERROR ('DBErrorMessage', @ErrorSeverity, @ErrorState);
END CATCH
END
将数据库设置回 multi_user
的最佳方法是什么?恐怕最直接的方法可能会导致
Database 'MyDatabase' is already open and can only have one user at a time.
异常。
最直接的意思是这个:
ALTER DATABASE [MyDatabase] SET MULTI_USER
"current user is currently connected to it" 可能是 SQL SERVER MANAGEMENT STUDIO window 本身。
SELECT 主数据库,以及 运行
ALTER DATABASE TherapyDatabaseWTS
SET MULTI_USER;
GO
或者如果您想使用 SQL SERVER MANAGEMENT STUDIO,请按照
Right click Database >> Properties >> Options >> State >> RestrictAccess
>> Choose Multi_user and click OK
如果你简单地把
ALTER DATABASE [MyDatabase] SET MULTI_USER
在 CATCH 之后?它不应该找到任何活动用户,因为您在 program/stored 过程中处于单用户状态?
此外,您是否尝试过在 CATCH 块中使用 ROLLBACK 将所有内容放入事务中?
我刚刚做了一个快速测试:
BEGIN TRY
ALTER DATABASE DB1 SET SINGLE_USER
SELECT 1/0 --it generates an error
END TRY
BEGIN CATCH
ALTER DATABASE DB1 SET MULTI_USER
END CATCH
它似乎在工作,批处理完成后 DB1 仍处于多用户模式...
已经有一段时间了,但我相信 with rollback immediate
选项表明您无论如何都希望它成功。正常行为会阻塞,直到所有 运行 事务都成功完成。
此外,当数据库已经是多用户时,将数据库设置为多用户模式是安全的。
但是,如果您想真正确定,请使用嵌套的 try catch 块。第一个处理移动到单用户模式的任何错误,内部一个处理单用户模式下发生的错误..
见try-catch documentation
和 alter database documentation
一些关于完整性的最后说明:
1) 如果错误足够严重,您的连接将被关闭,您的数据库仍将处于单用户模式。
2) 你应该有一个测试实例,你可以在其中安全地尝试这些东西,这样你就可以了解生产中会发生什么。
- 找出用户和会话 ID
- 写一个sql查询为:sp_who(这将显示所有进程)
记下上述查询结果中用户的“spid”并终止该会话。
将您的数据库更改为 multi-user 模式
输入以下查询
改变数据库[你的数据库]
设置MULTI_USER
这是我的查询:
IF EXISTS(%some query%)
BEGIN
BEGIN TRY
ALTER DATABASE [MyDatabase] SET single_user WITH ROLLBACK IMMEDIATE;
--do something
--throw some exception
END TRY
BEGIN CATCH
--here I want to set database back to multi_user
RAISERROR ('DBErrorMessage', @ErrorSeverity, @ErrorState);
END CATCH
END
将数据库设置回 multi_user
的最佳方法是什么?恐怕最直接的方法可能会导致
Database 'MyDatabase' is already open and can only have one user at a time.
异常。
最直接的意思是这个:
ALTER DATABASE [MyDatabase] SET MULTI_USER
"current user is currently connected to it" 可能是 SQL SERVER MANAGEMENT STUDIO window 本身。
SELECT 主数据库,以及 运行
ALTER DATABASE TherapyDatabaseWTS
SET MULTI_USER;
GO
或者如果您想使用 SQL SERVER MANAGEMENT STUDIO,请按照
Right click Database >> Properties >> Options >> State >> RestrictAccess
>> Choose Multi_user and click OK
如果你简单地把
ALTER DATABASE [MyDatabase] SET MULTI_USER
在 CATCH 之后?它不应该找到任何活动用户,因为您在 program/stored 过程中处于单用户状态?
此外,您是否尝试过在 CATCH 块中使用 ROLLBACK 将所有内容放入事务中?
我刚刚做了一个快速测试:
BEGIN TRY
ALTER DATABASE DB1 SET SINGLE_USER
SELECT 1/0 --it generates an error
END TRY
BEGIN CATCH
ALTER DATABASE DB1 SET MULTI_USER
END CATCH
它似乎在工作,批处理完成后 DB1 仍处于多用户模式...
已经有一段时间了,但我相信 with rollback immediate
选项表明您无论如何都希望它成功。正常行为会阻塞,直到所有 运行 事务都成功完成。
此外,当数据库已经是多用户时,将数据库设置为多用户模式是安全的。
但是,如果您想真正确定,请使用嵌套的 try catch 块。第一个处理移动到单用户模式的任何错误,内部一个处理单用户模式下发生的错误..
见try-catch documentation 和 alter database documentation
一些关于完整性的最后说明:
1) 如果错误足够严重,您的连接将被关闭,您的数据库仍将处于单用户模式。
2) 你应该有一个测试实例,你可以在其中安全地尝试这些东西,这样你就可以了解生产中会发生什么。
- 找出用户和会话 ID
- 写一个sql查询为:sp_who(这将显示所有进程)
记下上述查询结果中用户的“spid”并终止该会话。
将您的数据库更改为 multi-user 模式
输入以下查询
改变数据库[你的数据库]
设置MULTI_USER