Как мне вернуться в режим 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?
- Узнать пользователя и идентификатор сеанса
- напишите запрос sql как: sp_who (это покажет все процессы)
Запишите «spid» пользователя из приведенного выше результата запроса и завершите этот сеанс.
Переведите свою БД в многопользовательский режим.
введите приведенный ниже запрос
ИЗМЕНИТЬ БАЗУ ДАННЫХ [ваша БД]
УСТАНОВИТЬ МНОГОПОЛЬЗОВАТЕЛЬСКИЙ