0

这是我的查询:

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?恐怕最直接的方法可能会导致

数据库“MyDatabase”已经打开,一次只能有一个用户。

例外。

通过最直接的方式,我的意思是这个:

ALTER DATABASE [MyDatabase] SET MULTI_USER
4

4 回答 4

1

“当前用户当前连接到它”可能是 SQL SERVER MANAGEMENT STUDIO 窗口本身。

选择主数据库,然后运行

ALTER DATABASE TherapyDatabaseWTS
SET MULTI_USER;
GO

或者,如果您想使用 SQL SERVER MANAGEMENT STUDIO,请按照

Right click Database >> Properties >> Options >> State >> RestrictAccess 
                                                  >> Choose Multi_user and click OK
于 2015-01-12T15:13:28.477 回答
1

如果你简单地把会发生什么

ALTER DATABASE [MyDatabase] SET MULTI_USER

在 CATCH 之后?它不应该找到任何活动用户,因为您是程序/存储过程中的单个用户?

另外,您是否尝试过在 CATCH 块中使用 ROLLBACK 将所有内容放入事务中?

于 2015-01-12T15:39:31.597 回答
1

我刚刚做了一个快速测试:

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 仍处于多用户模式......

于 2015-01-12T16:12:02.487 回答
1

已经有一段时间了,但我相信with rollback immediate可以选择说无论如何你都希望它成功。正常行为会阻塞,直到所有正在运行的事务都成功完成。

此外,当数据库已经是多用户时将其设置为多用户模式是安全的。

但是,如果您想真正确定,请使用嵌套的 try catch 块。第一个处理移动到单用户模式的任何错误,内部处理单用户模式下发生的错误。

请参阅try-catch 文档更改数据库文档

为了完整起见,最后几点说明:

1)如果错误足够严重,您的连接将被关闭,您的数据库仍将处于单用户模式。

2)你应该有一个测试实例,你可以安全地尝试这些东西,这样你就可以了解生产中会发生什么。

于 2015-01-12T19:49:49.763 回答