Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как сделать так чтобы пыталась выполниться команда, и при неудачной попытке скрипт продолж  [new]
sql_user2
Member

Откуда:
Сообщений: 382
Как сделать так чтобы пыталась выполниться команда, и при неудачной попытке скрипт продолжался?

Например такой запрос:
Alter database fsb_clon set recovery simple;
27 апр 17, 18:56    [20441491]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать так чтобы пыталась выполниться команда, и при неудачной попытке скрипт продолж  [new]
Rankatan
Member

Откуда:
Сообщений: 250
sql_user2
Как сделать так чтобы пыталась выполниться команда, и при неудачной попытке скрипт продолжался?

Например такой запрос:
Alter database fsb_clon set recovery simple;

try catch проверял?

еще вариант:
SET ANSI_WARNINGS OFF
SET ARITHABORT OFF
....
27 апр 17, 18:59    [20441500]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать так чтобы пыталась выполниться команда, и при неудачной попытке скрипт продолж  [new]
Добрый Э - Эх
Guest
sql_user2,

Как-то так?
27 апр 17, 19:01    [20441504]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать так чтобы пыталась выполниться команда, и при неудачной попытке скрипт продолж  [new]
Rankatan
Member

Откуда:
Сообщений: 250
Добрый Э - Эх
sql_user2,

Как-то так?

а alter database блок try catch сможет обработать?
27 апр 17, 19:04    [20441513]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать так чтобы пыталась выполниться команда, и при неудачной попытке скрипт продолж  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 2979
Rankatan
Добрый Э - Эх
sql_user2,

Как-то так?

а alter database блок try catch сможет обработать?
28 апр 17, 06:59    [20442168]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать так чтобы пыталась выполниться команда, и при неудачной попытке скрипт продолж  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 2979
Rankatan
Добрый Э - Эх
sql_user2,

Как-то так?

а alter database блок try catch сможет обработать?


тут, мне кажется, надо смотреть на ошибки, которые рвут коннект, и, возможно, try catch не справится, но я не утверждаю.
В свое время я делал линкед сервер на самого себя, и вызывал через execute at критические запросы. При таком подходе у меня скрипт отрабатывал до упора
28 апр 17, 06:59    [20442169]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать так чтобы пыталась выполниться команда, и при неудачной попытке скрипт продолж  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3712
Rankatan
Добрый Э - Эх
sql_user2,

Как-то так?

а alter database блок try catch сможет обработать?


аперидил
try-catch в t-sql свеобразный и удивительный
28 апр 17, 12:41    [20443335]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать так чтобы пыталась выполниться команда, и при неудачной попытке скрипт продолж  [new]
o-o
Guest
catch отработает.
и можно даже зациклить выполнение.
только, IMHO, полезно не ретраить бездумно подобные команды,
а читать ошибки и обдумывать свои крывые действия.

пятничная история с участием супер ДБА

избавили нас от немцев-админов, теперь у нас администрирование еще круче стало.
по-прежнему раз в сутки(ночью) OLTP-базу ресторят на сервер отчетников и делают ее ридонли.
до перевода в ридонли скрипт мапит нужных юзеров (это разные сервера, юзеров-отчетников нет в исходной базе).

вчера им среди дня понадобилось нового юзера отмапить.
и вот один ДБА пытается перевести базу в READ_WRITE.
команда висит, но не потому, что кто-то из той базы читает.
вообще пустое sys.dm_exec_requests, а вот сессий открытых навалом, да:
просто студия открыта с коннектом к этой базе.

подтягиваются отчетники, начинают получать
Msg 952, Level 16, State 1, Line 1
Database 'CORESQL7' is in transition. Try the statement later.


в результате: читателей нет, команда висит, юзеры негодуют.
я молча наблюдаю этот бардак, мне сказано ничего им не объяснять, чтобы сами рулили.

в sys.dm_os_waiting_tasks 5 строк, во всех эта сессия, переводящая в READ_WRITE.
и перечислены те, кто блокирует, и у них всех last_request_end_time в 8 утра.

жалобы доходят до ДБА, стопит он свою команду.
смотрю, уже второй пробует:
на этот раз с WITH NO_WAIT.
этому просто обязана вывалиться ошибка
Msg 5070, Level 16, State 2, Line 1
Database state cannot be changed while other users are using the database

но видать не доходит, о чем пишут.

так и ждали ночи.
ночью у них работает немецкий скрипт рестора, так вот немцы знают with rollback immediate
и базы в оффлайн переводят, чтобы все коннекты отвалить.
вот так и проканалось.

а теперь репро для желающих:
открываем окно в студии и делаем use MyDB, где MyDB любая неиспользуемая база.
в соседнем окне выполняем
begin try
  alter database MyDB set read_only with no_wait
end try
begin catch
  print 'catch block'  
end catch


в catch попадаем, да, можно в try выставить label и на него отправлять:
retry:
begin try
  alter database ro set read_only with no_wait
end try
begin catch
  goto retry
end catch


а в результате что будет-то?
юзерам in transition,
запускателю команды шиш.
все это вместо того, чтобы посмотреть, что на сервере происходит, и меры принять

К сообщению приложен файл. Размер - 38Kb
28 апр 17, 13:49    [20443621]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать так чтобы пыталась выполниться команда, и при неудачной попытке скрипт продолж  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7780
Показательно...
28 апр 17, 15:53    [20444234]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить