【问题标题】:How do I go back to multi_user mode如何返回多用户模式
【发布时间】:2015-01-12 15:09:44
【问题描述】:

这是我的查询:

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

【问题讨论】:

    标签: sql sql-server tsql multi-user single-user


    【解决方案1】:

    已经有一段时间了,但我相信with rollback immediate 选项表明您希望无论如何都能成功。正常行为会阻塞,直到所有正在运行的事务都成功完成。

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

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

    try-catch documentationalter database documentation

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

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

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

    【讨论】:

      【解决方案2】:

      “当前用户当前连接到它”可能是 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
      

      【讨论】:

      • 有时可能会出现这种情况,但如果我想从我的程序中做到这一点呢?还有其他方法可以实现吗?
      • 我的问题是当 SET SINGLE USER 失败并抛出异常,所以数据库已经处于多用户状态,你为什么要这样设置
      • 这是卸载场景。我想将[MyDatabase] 设置为single_user,然后删除db。并且我想将其设置回multi_user,以防在丢弃期间出现异常。
      • 这就是我的观点,首先DB是多用户的,然后你尝试设置为Single USer,但是失败了,所以DB是在多用户状态下自动reamins?不是
      • 并非如此。成功设置为单用户,然后我尝试删除db,失败,db停留在单用户模式。
      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        如果你简单地输入会发生什么

        ALTER DATABASE [MyDatabase] SET MULTI_USER
        

        在 CATCH 之后?由于您在程序/存储过程中处于单用户状态,因此它不应该找到任何活动用户?

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

        【讨论】:

        • 是否保证 db 会被我的用户使用?如果有保证,那么这个变种完全适合我。
        • 我认为在ms sql的事务中禁止ALTER DATABASE
        • 如果可以设置为多用户,那么当前登录的用户应该是数据库中唯一的用户。
        猜你喜欢
        • 2012-04-15
        • 1970-01-01
        • 2022-11-02
        • 2022-10-15
        • 2023-03-24
        • 1970-01-01
        • 2022-08-24
        • 2014-09-22
        • 1970-01-01
        相关资源
        最近更新 更多