Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 ALTER TRIGGER и нет блокировок  [new]
LightN
Member

Откуда: Москва
Сообщений: 192
Добрый день.
Достаточно часто приходится корректировать TRIGGER-а в процессе работы компании, а это 30-50 пользователей.
Например, потребовалось ввести новый статус в таблицу, а в TRIGGER-е его (этот новый статус) нужно как-то обработать.
Нет проблем, если это делаешь вечером, когда пользователей мало. ALTER в 90% случаев чаще сам проскакивает быстро, а если нет, то можно просто попросить выйти всех из БД на 1-у минуту. Другое дело, когда это нужно сделать утром (30-50 пользователей). В этом случае ALTER TRIGGER вызывает в Activity Monitor кучу процессов. Моментально лезут блокировки - Blocking и Blocked.
Есть ли какой-то хитрый способ обойти это без "всем покинуть БД ...", т.е. как повысить приоритет ALTER TRIGGER и притормозить другие процессы на некоторое время (если такое в приципе возможно?) Заранее спасибо.
11 июл 12, 11:29    [12849346]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER и нет блокировок  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
LightN
Есть ли какой-то хитрый способ обойти это без "всем покинуть БД ...", т.е. как повысить приоритет ALTER TRIGGER и притормозить другие процессы на некоторое время (если такое в приципе возможно?) Заранее спасибо.
Зачем?
11 июл 12, 11:45    [12849453]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER и нет блокировок  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31959
LightN
Есть ли какой-то хитрый способ обойти это без "всем покинуть БД ...", т.е. как повысить приоритет ALTER TRIGGER и притормозить другие процессы на некоторое время (если такое в приципе возможно?) Заранее спасибо.
"Притормозить" - это как, грохнуть чужие процессы с потерей данных в неподтверюдённых транзакциях?

Вы похоже думаете, что ожидание и блокировки - это просто ошибка разработчиков из микрософта :-) Или что серверу не хватает процессора и памяти, что бы заменить эту тыщу байтов кода триггера.

ALTER TRIGGER ставит запрос на блокировку в очередь, и ждёт, пока использующие ресурс процессы не освободят этот ресурс.
11 июл 12, 11:48    [12849478]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER и нет блокировок  [new]
LightN
Member

Откуда: Москва
Сообщений: 192
Чтобы сделать ALTER TRIGGER быстро и сразу, а не вечером (когда 90% пользователей сами покинут БД и уйдут домой).
11 июл 12, 11:49    [12849484]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER и нет блокировок  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
LightN
Чтобы сделать ALTER TRIGGER быстро и сразу.
Что плохого, если это будет не "быстро и сразу"?
11 июл 12, 11:52    [12849505]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER и нет блокировок  [new]
Glory
Member

Откуда:
Сообщений: 104751
LightN
Чтобы сделать ALTER TRIGGER быстро и сразу, а не вечером (когда 90% пользователей сами покинут БД и уйдут домой).

Чем ALTER TRIGGER лучше команд других пользователей, которые используют эту же таблицу ?
11 июл 12, 11:59    [12849573]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER и нет блокировок  [new]
LightN
Member

Откуда: Москва
Сообщений: 192
Glory
Чем ALTER TRIGGER лучше команд других пользователей, которые используют эту же таблицу ?

Нет не лучше, но ALTER TRIGGER в моём случае может повлиять на некую общую схему (бизнес схему) работы компании. Т.е., конечно, можно и вечером это сделать, но компания 1 день будет работать немного по другому (т.е. по старому) алгоритму, что ни есть правильно.
Я нашёл способ выкрутиться из ситуации -> ALTER TRIGGER не использовать вообще. Я использую ALTER PROC. Т.е. если в TRIGGER-е есть обработка другой таблицы (не inserted и не deleted), то делается из TRIGGER-а вызов PROC-ры, которая будет всё делать тоже самое и + ко всему она не блокирует процессы пользователей при ALTER PROC.
Просто сам мой проект большой и TRIGGER-ов там много и не все выписаны таким образом.
У меня была м.б. надежда на чудо :)
11 июл 12, 12:24    [12849768]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER и нет блокировок  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3752
KILL - чудная команда, юзеры подождут:)
11 июл 12, 12:27    [12849794]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER и нет блокировок  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31959
LightN
Я нашёл способ выкрутиться из ситуации -> ALTER TRIGGER не использовать вообще. Я использую ALTER PROC. Т.е. если в TRIGGER-е есть обработка другой таблицы (не inserted и не deleted), то делается из TRIGGER-а вызов PROC-ры, которая будет всё делать тоже самое и + ко всему она не блокирует процессы пользователей при ALTER PROC.
Наверное, можно и так, но будет неприятный эффект - при ALTER PROC будут отменяться все пользовательские транзакции, которые в этот момент находились на выполнении процедуры...

Видимо, проблема в том, что надолго без реальной потребности блокируются таблицы, и из за этого триггер не может измениться. Нужно либо поправить приложение и ждать конца ALTER TRIGGER (тогда его придётся ждать меньше), либо смириться с потерей данных пользователей.
11 июл 12, 13:12    [12850206]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER и нет блокировок  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
alexeyvg
Наверное, можно и так, но будет неприятный эффект - при ALTER PROC будут отменяться все пользовательские транзакции, которые в этот момент находились на выполнении процедуры...
А можно пруфлинк?
11 июл 12, 13:21    [12850289]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER и нет блокировок  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31959
invm
alexeyvg
Наверное, можно и так, но будет неприятный эффект - при ALTER PROC будут отменяться все пользовательские транзакции, которые в этот момент находились на выполнении процедуры...
А можно пруфлинк?
Это у меня часто возникает при изменении процедур - падает пакет импорта, который в этот момент процедуру выполнял :-)

2801, The definition of object 'тут имя процедуры' has changed since it was compiled
11 июл 12, 14:16    [12850693]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER и нет блокировок  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
LightN,

Можно создать табличку, где у поля будут значения 1 или 0.
А в триггере условие IF значения из поля таблички. Если 1, тогда все условия, по списку...

Разумно?
11 июл 12, 16:49    [12851945]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER и нет блокировок  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
Если нужно, вы меняете значение поля в табличке. Триггер не трогаете.
11 июл 12, 16:49    [12851953]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER и нет блокировок  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
alexeyvg
invm
пропущено...
А можно пруфлинк?
Это у меня часто возникает при изменении процедур - падает пакет импорта, который в этот момент процедуру выполнял :-)

2801, The definition of object 'тут имя процедуры' has changed since it was compiled
Ага, понятно. А то я уже про что-то страшное подумал :)
11 июл 12, 17:11    [12852125]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER и нет блокировок  [new]
LightN
Member

Откуда: Москва
Сообщений: 192
trew
Если нужно, вы меняете значение поля в табличке. Триггер не трогаете.

Вы правы, таких хитрых обскоков можно много придумать, только на это нужно время, а его нет на такие красивые переделки. Время есть только в рабочее время :) А новый триггер нужно сделать-переделать, накатить, проверить, поправить и т.д., а как это сделать если блокировки лезут и ничего сделать с этим не получается? Передвинуть график работы - не выход. У меня в проекте > 500 View, 120 Tab. Вот alexeyvg точно написал, что это всё из-за "без реальной потребности блокируются таблицы". Согласен, а что с этим можно сделать? М.б. везде расставить with nolock - и? Не уверен что поможет. У меня сервер 2005-й, а клиенты работают из под MSAccess к прилинкованным таблицам 2005-го. Было впечатление, что MSAccess криво открывает динасеты с with nolock. Но это не так, т.к. при клиентских insert, update нет зависаний (блокировок), всё нормально живёт. Они остались только на ALTER триггеров :(
М.б. есть мысли?
11 июл 12, 18:08    [12852444]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER и нет блокировок  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
alexeyvg
LightN
Я нашёл способ выкрутиться из ситуации -> ALTER TRIGGER не использовать вообще. Я использую ALTER PROC. Т.е. если в TRIGGER-е есть обработка другой таблицы (не inserted и не deleted), то делается из TRIGGER-а вызов PROC-ры, которая будет всё делать тоже самое и + ко всему она не блокирует процессы пользователей при ALTER PROC.
Наверное, можно и так, но будет неприятный эффект - при ALTER PROC будут отменяться все пользовательские транзакции, которые в этот момент находились на выполнении процедуры...
Я что-то пропустил конкретное. "Счастье в неведенье".
ALTER PROC у меня часто висит, пока не втиснулся между вызовами, и ошибки я не наблюдал.

Проясните, пошлите в BOL пжалуста.

trew, а разве не будет такого, что будет также тяжело (с кучей локировок) изменить/добавить в эту табличку ?
По мне так это просто перенос проблемы с одного типа объекта на другой.
Или я не понял ваше решение?
11 июл 12, 18:26    [12852563]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER и нет блокировок  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31959
Mnior
Я что-то пропустил конкретное. "Счастье в неведенье".
ALTER PROC у меня часто висит, пока не втиснулся между вызовами, и ошибки я не наблюдал.

Проясните, пошлите в BOL пжалуста.
Я проверил на простом примере - ошибка не проявляется. Однако в реальной сиистеме она есть, и в BOL ошибка в списке ошибок есть (по номеру можно найти), так что это не показалось :-)

Да, нужно поискать в BOL подробности... К сожалению, в списке расшифровки и пояснений нет, нужно искать
11 июл 12, 18:39    [12852632]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER и нет блокировок  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
alexeyvg,

На счёт этого есть в connection: Msg 2801, The definition of object 'xxx' has changed since it was compiled.
Мне кажется, что данная ошибка проявлялась ранее, т.к. была заложена в модель. Но со временем модель и поведение ведь меняется (удалять же в справочнике нельзя).
Возможно и сейчас проявляется, но по каким-то хитрым причинам.

Эта причина может быть очень полезна в вопросе ТС.
--------------
Просто проблема обновления, как я понимаю есть и она неразрешимая. Например, как выстраивается эта очередь процессов ?
Если бы использовался тупо механизм локировок, то гипотетически можно вообще никогда не обновить объект (или строку)
S локировки совместимы одновременно друг с другом, а X/U нет, и поэтому X можно вечно ждать S транзакции, которые постоянно заменяют друг друга.
И для меня в этом большой вопрос.
11 июл 12, 19:11    [12852803]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER и нет блокировок  [new]
step_ks
Member

Откуда:
Сообщений: 936
alexeyvg
Mnior
Я что-то пропустил конкретное. "Счастье в неведенье".
ALTER PROC у меня часто висит, пока не втиснулся между вызовами, и ошибки я не наблюдал.

Проясните, пошлите в BOL пжалуста.
Я проверил на простом примере - ошибка не проявляется. Однако в реальной сиистеме она есть, и в BOL ошибка в списке ошибок есть (по номеру можно найти), так что это не показалось :-)

Есть, есть и еще как. При рекомпиляциях запросто словить.

Первый коннект:
if object_id('dbo.testproc','P') is not null drop proc dbo.testproc
go
create proc dbo.testproc
as
declare @i int
set @i=1
while @i<100000
    begin
        select a.id into #t from sysobjects a,sysobjects b option (recompile)
        drop table #t
        set @i=@i+1
    end
go
exec dbo.testproc


Второй коннект:
alter proc dbo.testproc
as
return 1
go


В первом ловим
Msg 2801, Level 16, State 1, Procedure testproc, Line 7
The definition of object 'testproc' has changed since it was compiled.


Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (Intel X86)
Jun 17 2011 00:57:23
Copyright (c) Microsoft Corporation
Express Edition with Advanced Services on Windows NT 5.1 <X86> (Build 2600: Service Pack 3)
11 июл 12, 22:31    [12853324]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER и нет блокировок  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31959
step_ks
Есть, есть и еще как. При рекомпиляциях запросто словить.

Первый коннект:
Когда я делал тест, не получилось быстро повторить ошибку :-(
11 июл 12, 23:27    [12853501]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER и нет блокировок  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
step_ks
Msg 2801, Level 16, State 1, Procedure testproc, Line 7
The definition of object 'testproc' has changed since it was compiled.

7:        select a.id into #t from sysobjects a,sysobjects b option (recompile)
Картина начинает немного проявляться.
Или тупое предположение?
12 июл 12, 00:26    [12853707]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER и нет блокировок  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
LightN
trew
Если нужно, вы меняете значение поля в табличке. Триггер не трогаете.

Вы правы, таких хитрых обскоков можно много придумать, только на это нужно время, а его нет на такие красивые переделки. Время есть только в рабочее время :) А новый триггер нужно сделать-переделать, накатить, проверить, поправить и т.д., а как это сделать если блокировки лезут и ничего сделать с этим не получается? Передвинуть график работы - не выход.
Клево, это у вас разработка и тестирование прям на рабочей базе, да? Тогда уж сразу переводите базу в single-user mode с откатом всех пользователей и делов то, а то че они вам мешают разработкой заниматься.
А вообще, советую менять процесс или сразу работу :)
12 июл 12, 01:54    [12853854]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER и нет блокировок  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Mnior
step_ks
Msg 2801, Level 16, State 1, Procedure testproc, Line 7
The definition of object 'testproc' has changed since it was compiled.

7:        select a.id into #t from sysobjects a,sysobjects b option (recompile)
Картина начинает немного проявляться.
Или тупое предположение?
Да нет, так оно и есть.
Процедура обновилась, а "старая" продолжала работать. Более того процедуру можно удалить, а запущенные процессы отработают.
Получается при вызове, процедура как объект не локируется. А только при получении/изменения её "текста".

Если в коде написано типа recompile, то скуль просто берёт текст с запомненой позиции.

А почему всё таки, когда делаешь ALTER PROC на высоконагруженной системе то возникают блокировки и не сразу обновляется.
Потому что системные объекты сильно нагруженны?
12 июл 12, 13:58    [12856651]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER и нет блокировок  [new]
LightN
Member

Откуда: Москва
Сообщений: 192
Mind
Клево, это у вас разработка и тестирование прям на рабочей базе, да? Тогда уж сразу переводите базу в single-user mode с откатом всех пользователей и делов то, а то че они вам мешают разработкой заниматься.
А вообще, советую менять процесс или сразу работу :)

Задача была: на "прям на рабочей базе, да ..." сделать небольшое изменение в тригере без kill процессам и покиданий БД пользователям. Такое м.б. если, например, начальник просит немного изменить алгоритм бизнес-процесса, и это приводит к правке тригера. У Вас есть решение конкретно по теме? М.б. всё же есть способ ... Логично же, чтобы запущенные процессы отработали на старом коде а новые стартовали уже на новом?
Лучше когда решение + юмор, чем только один юмор? Разработок "в single-user mode" мне хватает, а времени на улучшение (чтобы как-то выкрутиться и отказаться от ALTER тиргера) работающих (отлаженных) кодов написанных 10-12 лет тому назад просто нет.
12 июл 12, 18:01    [12858800]     Ответить | Цитировать Сообщить модератору
 Re: ALTER TRIGGER и нет блокировок  [new]
Glory
Member

Откуда:
Сообщений: 104751
LightN
Задача была: на "прям на рабочей базе, да ..." сделать небольшое изменение в тригере без kill процессам и покиданий БД пользователям. Такое м.б. если, например, начальник просит немного изменить алгоритм бизнес-процесса, и это приводит к правке тригера. У Вас есть решение конкретно по теме?

ALTER TRIGGER не требует "kill процессам и покиданий БД пользователям". Он всего лишь требует дождаться, когда стунт возможными нужные блокировки. Как и многие другие команды.
Именно тогда и получится "логично же, чтобы запущенные процессы отработали на старом коде а новые стартовали уже на новом"
12 июл 12, 18:25    [12858987]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить