Можно ли прочитать данные во временной таблице другого сеанса? - PullRequest
6 голосов
/ 17 февраля 2012

Мы поддерживаем (и иногда отлаживаем) большую внутреннюю систему.Система имеет более 20 баз данных, а также ряд серверов, взаимодействующих с другими системами, обрабатывающих данные и т. Д. Не все разработано собственными силами, т.е.у нас не всегда есть доступ к исходному коду.

В одном месте мы можем видеть, как система создает таблицу #temp, а затем, на следующем шаге, происходит сбой из-за ошибки данных.Мы видим существование таблицы #temp в Management Studio - она ​​существует в tempdb --> Temporary Tables как что-то вроде

#MyStuff________________________________________________________________________________________________________000000A65029

Очевидно, что контекстное меню здесь не предлагает полногофункциональность (с помощью Создать таблицу, выбрать 1000 и т. д.) - но только Reports и Refresh.

Я могу найти таблицу в sys.objects, sys.tables и даже определение столбца в sys.columns.

Вопрос в том, можно ли каким-либо образом получить доступ к данным в таблице?Мы можем прервать выполнение, чтобы убедиться, что таблица остается в области видимости, поэтому исчезновение таблицы не должно быть проблемой.Это не то, что должно быть сделано регулярно или в коде - это более или менее одноразовая сделка.(Надеюсь).

Ответы [ 2 ]

7 голосов
/ 17 февраля 2012

Если перед именем временной таблицы ставится два окто-типа, например ##mystuff, он создает глобальную временную таблицу, которая существует вне области сеанса.

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

6 голосов
/ 17 февраля 2012

Громоздко, но вы можете просматривать страницы таблиц при входе администратора.

Получить идентификатор объекта;

select object_id from tempdb.sys.tables where name like '#mystuff%'

Получить список выделенных страниц;

dbcc ind('tempdb', <object id>, -1)

для каждого из PageFID / PagePID (идентификаторы файлов / страниц)

dbcc traceon(3604);
dbcc page(tempdb, <PageFID>, <PagePID>, 3) with tableresults

Если я создаю #mystuff из другого сеанса, я могу видеть в представлении dbcc page из моего собственного сеанса:

Slot 0 Offset 0x60 Length 18    Slot 0 Column 1 Offset 0xb Length 7 Length (physical) 7 myFieldName MyValue
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...