Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Шредер
Guest |
Собственно, subj. |
2 апр 02, 08:11 [24855] Ответить | Цитировать Сообщить модератору |
Александр+Спелицин
Guest |
Временные таблицы доступны только из той сессии, из которой они были созданы. Поэтому правильный ответ - id текущей сессии. Т.е.: Select @@spid |
4 апр 02, 19:51 [24856] Ответить | Цитировать Сообщить модератору |
Snake
Guest |
To Александр+Спелицин Временные таблицы доступны только из той сессии, из которой они были созданы. Вот тут вы батенька не правы... Есть еще такие временные таблицы - ##<table_name> Вопрос очевидно по ним! |
5 апр 02, 05:40 [24857] Ответить | Цитировать Сообщить модератору |
alexeyvg
Guest |
Не знаю, что нужно "Шредер", а вот мне нужно было узнать, кто создал локальную врем. таблицу. Например, в tempdb..sysobjects я вижу: name id #mytable________________000000004BC1 894946889 #mytable________________000000004CE2 839481277 Кто их создал? Точно знаю, что не мой процесс. |
5 апр 02, 08:46 [24858] Ответить | Цитировать Сообщить модератору |
nic_ii
Guest |
У меня несколько раз было такое, что после завершения процесса временные таблицы оставались неудаленными. То ли процедура завершалась некорректно, то ли баг какой в семерке... однако после перезагрузки сервера они исчезали. Если же породивший таблицу процесс еще не умер то его номер "можно" узнать через Enterprise manager - идешь в Management->CurrentActivity->Locks/Objects и смотришь tempdb там все процессы, которые ее держат (при большой нагрузке на сервер и активном использовании временных таблиц это тебе ничего не даст так как нет информации об именах залокированных таблиц ![]() |
10 апр 02, 11:57 [24859] Ответить | Цитировать Сообщить модератору |
Между сообщениями интервал более 1 года. |
court Member Откуда: Сообщений: 2241 |
Подскажите, ничего с апреля 2002г. не изменилось по сабжевому вопросу ? :) т.е. ситуация такая, как описывает alexeyvg тут 24858 : - в списке временных таблиц есть таблица
Нужно узнать SPID процесса, который её создал и "прибить" его. Есть такая возможность ? |
|||||
15 авг 18, 10:25 [21642626] Ответить | Цитировать Сообщить модератору |
buser Member Откуда: Санкт-Петербург Сообщений: 4537 |
court, Dude, who owns that #temp table? |
15 авг 18, 10:52 [21642651] Ответить | Цитировать Сообщить модератору |
court Member Откуда: Сообщений: 2241 |
buser, Спасибо ! Похоже, это оно, но что-то не очень пока получаеться ... Сервер 2008R2. Пробовал первые два скрипта (те которые "In SQL Server 2005, 2008 and 2008 R2, you should be able to pull this information from the default trace"), - оба валятся с ошибкой Msg 568, Level 16, State 23, Line 8 Файл этот (Log_1827.trc) - есть. Профайлером открываеться ... |
15 авг 18, 11:51 [21642772] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9633 |
court, Как вариант, можно поискать в кеше планы, обращающиеся к искомой таблице. В атрибутах такого плана будет содержаться spid, для которого он был скомпилирован. Искать примерно так: declare @name sysname = N'#mytabe'; with xmlnamespaces(default 'http://schemas.microsoft.com/sqlserver/2004/07/showplan') select distinct pa.value as session_id from (select quotename(@name)) o(name) cross apply sys.dm_exec_cached_plans cp cross apply sys.dm_exec_query_plan(cp.plan_handle) qp cross apply (select value from sys.dm_exec_plan_attributes(cp.plan_handle) where attribute = N'optional_spid') pa where qp.query_plan.exist('//*[@Database = "[tempdb]" and @Table = sql:column("o.name")]') = 1 and pa.value <> 0;Естественно, в результате может быть много мусора, или вообще результата не будет. Но, по крайней мере, можно попробовать. Задача упрощается если на таблице есть индекс, а еще лучше кластерный индекс. Тогда можно найти только живые временные таблицы: with xmlnamespaces(default 'http://schemas.microsoft.com/sqlserver/2004/07/showplan') select distinct pa.value as session_id from (select quotename(@name)) o(name) cross apply sys.dm_exec_cached_plans cp cross apply sys.dm_exec_query_plan(cp.plan_handle) qp cross apply (select value from sys.dm_exec_plan_attributes(cp.plan_handle) where attribute = N'optional_spid') pa cross apply (select qp.query_plan.query('//*[@Database = "[tempdb]" and @Table = sql:column("o.name")][@Index]').value('(*/@Index)[1]', 'sysname')) i(name) where qp.query_plan.exist('//*[@Database = "[tempdb]" and @Table = sql:column("o.name")][@Index]') = 1 and pa.value <> 0 and exists(select 1 from tempdb.sys.sysindexes where quotename(name) = i.name); |
15 авг 18, 12:41 [21642878] Ответить | Цитировать Сообщить модератору |
komrad Member Откуда: Сообщений: 5496 |
|
||
15 авг 18, 12:46 [21642891] Ответить | Цитировать Сообщить модератору |
komrad Member Откуда: Сообщений: 5496 |
отложите его в сторону и снова попробуйте запрос там еще 4 файла на диске если открывается профайлером, то поищите в профайлере |
||||
15 авг 18, 12:48 [21642894] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9633 |
Поправка:with xmlnamespaces(default 'http://schemas.microsoft.com/sqlserver/2004/07/showplan') select distinct pa.value as session_id from (select quotename(@name)) o(name) cross apply sys.dm_exec_cached_plans cp cross apply sys.dm_exec_query_plan(cp.plan_handle) qp cross apply (select value from sys.dm_exec_plan_attributes(cp.plan_handle) where attribute = N'optional_spid') pa cross apply (select qp.query_plan.query('//*[@Database = "[tempdb]" and @Table = sql:column("o.name")][@Index]').value('(*/@Index)[1]', 'sysname')) i(name) where qp.query_plan.exist('//*[@Database = "[tempdb]" and @Table = sql:column("o.name")][@Index]') = 1 and pa.value <> 0 and exists(select 1 from tempdb.sys.indexes where quotename(name) = i.name and object_name(object_id, db_id('tempdb')) like @name + N'[_]%'); |
15 авг 18, 12:50 [21642897] Ответить | Цитировать Сообщить модератору |
court Member Откуда: Сообщений: 2241 |
invm, пустой результат ... Проверил и на боевом 2008R2, где и "зависла" времянка. А затем на своём тестовом 2017-ом : в одном окне запроса SSMS создал времянку, вставил несколько записей и сделал SELECT из неё, и не закрывая первого окна, в другом выполнил этот запрос, - пусто в обоих случаях |
||
15 авг 18, 14:46 [21643192] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
court, если нет плана в кеше то и не будет нифига. Вообще глобальный смысл искать "зависщую" временную таблицы стремится к нулю. |
15 авг 18, 14:50 [21643203] Ответить | Цитировать Сообщить модератору |
court Member Откуда: Сообщений: 2241 |
- эта табличка - "флажок" который создаётся при запуске одной ХП, и держится установленным, пока эта ХП не отработает. Всё это для того, что бы ХП нельзя было запустить второй раз, до окончания выполнения запущенной первой -- Проверяем наличие врем.таб-флажка. Если таблица есть, то "на выход". Если нет - создаём. if exists (select 1 from tempdb..sysobjects where name like '#Flag%') begin -- "Флажок" - есть, ХП УЖЕ выполняется, - на выход RAISERROR ('!', 16, 1) return 0 end Вот сейчас получается такая ситуация, что "стартануть" ХП нельзя (т.е. проблему пока решил по другому, просто переименовав в ХП этот флажок на #Flag1, но суть вопроса осталась.) Вообще, можно как-то "чужую времянку" удалить, кроме как "убить" породивший её коннект или рестартануть сервер ? |
||
15 авг 18, 15:06 [21643243] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37143 |
|
||
15 авг 18, 15:09 [21643252] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
а они всё велосипеды изобретают |
||||
15 авг 18, 15:10 [21643254] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
с 2012+ default не пишет создание временных таблиц. Единсвенное, что ловить создание индекса на такой таблице. Но это всё костыли |
||
15 авг 18, 15:41 [21643303] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
ох, там так и написано :) варинат c EE очендь даже жизненный, но это до проблемы :) |
||||
15 авг 18, 15:48 [21643312] Ответить | Цитировать Сообщить модератору |
court Member Откуда: Сообщений: 2241 |
----------------------------------------------------------------------------- Хорошо, а на вопрос, "в каком коннекте было установлено вот это вот всё": DECLARE @result int; EXEC @result=sp_getapplock @Resource = 'test1' ,@LockMode = 'Exclusive' ,@LockOwner = 'Session' ,@LockTimeout = 0; ответ будет проще чем с "флажком" ? Так что бы "по быстрому" я его не нашел ... |
||||
15 авг 18, 16:09 [21643338] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
|
||||||
15 авг 18, 16:13 [21643347] Ответить | Цитировать Сообщить модератору |
court Member Откуда: Сообщений: 2241 |
тут 10510723 ещё вариант нашёл |
||||||
15 авг 18, 16:20 [21643360] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
та тоже самое, только dmv больше для людей :) |
||||
15 авг 18, 16:25 [21643369] Ответить | Цитировать Сообщить модератору |
invm Member Откуда: Москва Сообщений: 9633 |
|
||
15 авг 18, 16:35 [21643381] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
так не создавайте |
||||
15 авг 18, 16:37 [21643385] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Все форумы / Microsoft SQL Server | ![]() |