0

Вопрос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/), несмотря на мои первоначальные надежды.

ответ

0

Извините, не магия. Там нет собственного решения для чего вам нужно. SQL Server гарантирует, что сеанс, который устанавливает однопользовательский режим, является сеансом, который выживает. Как только этот сеанс завершается (пользователь отключается, сеть прерывается и т. Д.), «Слот» теперь доступен для любого другого соединения, включая определенные потоки рабочего потока или браузер объектов SSMS. ЦАП не является хорошей идеей ни для чего, кроме спасательных операций.

Вы можете использовать sqlcmd для запуска сценариев или вызвать файл сценария из PS (invoke-sqlcmd -inputfile "c: \ mysqlfile.sql" -сервер "из-за" servername \ serverinstance "-database" mydatabase "), поэтому он выполняется в один сеанс, а не отдельные сеансы из PS.

Есть много других способов предотвратить подключение пользователей к БД (триггеры, безопасность и т. Д.), Но они, как правило, рискованны, поскольку вам нужно очень тщательно внедрять блоки и следить за тем, чтобы блоки были безопасными и правильно удаляется, когда это делается. Это нетривиально, так как вам нужно учитывать потерю связи или потерю экземпляра и как справляться с состоянием после возобновления или восстановления. Получает настоящую беспорядочную, настоящую быструю, так что старайтесь осторожно.

Смежные вопросы