TL; DR: я думаю, что SQL сервер не выпустил блокировку Sch-M, и я не могу ее снять или найти транзакцию, удерживающую блокировку
Я пытался создать копию другой таблицы и выполнить некоторый сравнительный анализ обновлений данных с диска, и при выполнении BULK INSERT в пустой таблице возникла ошибка, потому что я использовал неправильное имя файла. Я запускал сценарий, выбирая большую часть текста из блокнота в SQL Server Management Studio и нажимая кнопку «Выполнить». Теперь никакие запросы, касающиеся таблицы, не могут выполняться, включая такие вещи, как OBJECT_ID или информацию о схеме в SQL Server Management Studio при ручном обновлении. Запросы просто зависают, и в последнем случае SSMS выдает ошибку о том, что блокировка не была снята в течение тайм-аута.
Пока я предпринял несколько шагов отладки.
Я посмотрел в таблице sys.dm_tran_locks
, отфильтрованной по идентификатору ресурса БД. Там я вижу несколько общих блокировок для самой БД и несколько эксклюзивных ключевых блокировок и ровно 1 блокировку на объекте, блокировку Sch-M. Когда я пытаюсь получить имя объекта из идентификатора ресурса в таблице sys.dm_tran_locks
, запрос зависает, как и OBJECT_ID () (и не для других имен / идентификаторов таблиц). Блокировка ссылается на идентификатор сеанса 54.
Я также просмотрел таблицу sys.dm_exec_requests
, чтобы попытаться найти дополнительную информацию о SPID 54, но нет строк с этим идентификатором сеанса. Фактически, единственные процессы - это те, которые принадлежат sa
, и единственный запрос, проверяющий таблицу sys.dm_exec_requests
, принадлежащую мне.
Отсюда, если я все правильно понимаю, похоже, что каким-то образом НАМНОГО Оператор INSERT каким-то образом не смог освободить требуемую блокировку Sch-M.
Итак, вот мои вопросы: почему все еще существует блокировка Sch-M на таблице, если процесс, которому она принадлежит, кажется, больше не существует ? Есть ли способ восстановить доступ к таблице без перезапуска серверного процесса SQL? Будет ли код SQL в сценарии после выполнения BULK INSERT, но только для пустой таблицы?
Я использую SQL Server 2016 и SQL Server Management Studio 2016.