ВопросSQL Server - однопользовательский режим - Упорство Какой Пользователь
Есть ли способ, при вводе в базу данных в однопользовательский режим, чтобы указать, что пользователь (в моем случае это текущий пользователь), и чтобы даже после того, как пользователь отключился, один сеанс оставался зарезервированным для этого определенного пользователя; т. е. это действительно однопользовательский, а не однократный пользователь?
фон
Чтобы дать некоторый контекст ...
У нас есть несколько сценариев для обновления данных в нашей тестовой среде. Недавно один из них ошибся, указав, что учетная запись пользователя, под которой выполняются сценарии, не имеет доступа к базе данных. В ходе расследования пользователь был системным администратором базы данных; так что это явно не так. Однако я обнаружил, что сценарий помещает базу данных в режим Single User
. При просмотре активных сеансов в БД я вижу, что один пользователь отличается от ожидаемой учетной записи (скорее это другая учетная запись службы, принадлежащая системе, которая периодически перерывает эту базу данных). Моего предположение, что произошло следующее:
- Скрипт работает как Пользователь
- Скрипт ставит DB в режиме одиночного пользователя
- Сценария выполняют некоторый запрос/е года
- Скрипт закрывает текущее соединение в то время как делают некоторые другие задачи
- UserB пытается подключиться к БД; успех, поскольку сеанс UserA теперь закрыт
- сеанс UserB остается открытым (поскольку UserB является сервисом с пулом соединений, даже после завершения операции сеанс остается открытым).
- Пользователь пытается восстановить соединение с БД; доступ запрещен, поскольку один сеанс принимается пользователем.
Существуют различные возможные решения.
- Перепишите скрипт, чтобы сохранить постоянное соединение (потенциально много усилий, тем более, что я не знаком с кодом)
- Отключить все услуги, которые могут попытаться подключиться периодически (вид поражений точки с помощью однопользовательский режим/также много дополнительных усилий, чтобы исследовать все учетные записи, которые могут подключаться, и поддерживать это)
- Добавить уловку к скрипту для уничтожения конкурирующих идентификаторов SPID и, таким образом, вернуть однопользовательский сеанс (я не как убивающие SPID, так как это влияет на целостность транзакций)
- использовать магию (т.е. см. принятый ответ на этот вопрос; h opefully)
Update
код использует PowerShell Invoke-SqlCmd
-х, который создает и удаляет соединения для каждой команды запуска; поэтому, как только база данных будет помещена в однопользовательский режим, соединение будет удалено. Я просмотрел параметры команд, чтобы увидеть, есть ли варианты для объединения/постоянных подключений, но ближайший я мог найти DedicatedAdministratorConnection
, и мне кажется, что я должен хорошо избегать (http://www.brentozar.com/archive/2011/08/dedicated-admin-connection-why-want-when-need-how-tell-whos-using/), несмотря на мои первоначальные надежды.