Как мне вернуться в режим 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? Я боюсь, что самый простой способ может привести к

База данных MyDatabase уже открыта и может иметь только одного пользователя одновременно.

исключение.

Самым простым способом я имею в виду это:

ALTER DATABASE [MyDatabase] SET MULTI_USER

5 ответов

Решение

Это было какое-то время, но я верю with rollback immediate Есть вариант сказать, что вы хотите, чтобы это было успешно, несмотря ни на что. блоки нормального поведения, пока все запущенные транзакции не будут успешно завершены.

Кроме того, установка базы данных в многопользовательский режим, когда она уже многопользовательская, безопасна.

Однако, если вы хотите быть действительно уверенным, используйте вложенный блок try catch. Первый обрабатывает любые ошибки, переходящие в однопользовательский режим, а внутренний обрабатывает ошибки, возникающие в однопользовательском режиме.

смотрите документацию по try-catch и документацию по изменению базы данных

Несколько заключительных замечаний для полноты:

1) Если ошибка достаточно серьезна, ваше соединение будет закрыто, и ваша база данных все еще будет в однопользовательском режиме.

2) У вас должен быть тестовый экземпляр, где вы можете безопасно испытать этот материал, чтобы вы могли узнать, что произойдет в производстве.

Я только что сделал быстрый тест:

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 все еще находится в многопользовательском режиме...

"Текущий пользователь в настоящее время подключен к нему" может быть само окно 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

Что произойдет, если вы просто положите

ALTER DATABASE [MyDatabase] SET MULTI_USER

после ловли? Он не должен найти ни одного активного пользователя, так как вы находитесь в однопользовательском режиме из вашей программы / хранимой процедуры?

Кроме того, вы пытались поместить все в транзакцию, используя ROLLBACK в блоке CATCH?

  1. Узнать пользователя и идентификатор сеанса
  • напишите запрос sql как: sp_who (это покажет все процессы)
  1. Запишите «spid» пользователя из приведенного выше результата запроса и завершите этот сеанс.

  2. Переведите свою БД в многопользовательский режим.

  • введите приведенный ниже запрос

    ИЗМЕНИТЬ БАЗУ ДАННЫХ [ваша БД]

    УСТАНОВИТЬ МНОГОПОЛЬЗОВАТЕЛЬСКИЙ

Другие вопросы по тегам