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

Откуда: Москва
Сообщений: 1713
уважаемые, подскажите пожалуйста
написал я скрипт проверки корректности кофигурирования системы.
там есть проверка доступности таблицы на ЛинкедСервере:
create table #tmp (TABLE_CAT sysname null, TABLE_SCHEM sysname null, TABLE_NAME sysname, TABLE_TYPE varchar(32), REMARKS varchar(254))
insert into #tmp exec sp_tables_ex @Server_LocalName
...
можно как-нибудь заставить скрипт работать дальше после возникновения ошибки в ходе этой проверки?
если нельзя - можно сделать проверку доступности таблицы менее критичным способом?
14 апр 05, 13:03    [1468031]     Ответить | Цитировать Сообщить модератору
 Re: как продолжить выполнения скрипта после возникновения ошибки?!  [new]
Веселов Константин
Member

Откуда: Новосибирск
Сообщений: 208
Если не предпринимать никаких специалных действий, то скрипт должен продожить свое выполнение и так. Сейчас не скажу точно, но только после воникновения какого-то количества ошибок подряд (несколько) сервер прерывает выполнение пакета.
14 апр 05, 13:12    [1468099]     Ответить | Цитировать Сообщить модератору
 Re: как продолжить выполнения скрипта после возникновения ошибки?!  [new]
profil
Member

Откуда: Москва
Сообщений: 1713
в том то и дело что не выполняет...
Server: Msg 17, Level 16, State 1, Procedure ...
SQL-сервер не существует, или отсутствует доступ.
14 апр 05, 13:22    [1468182]     Ответить | Цитировать Сообщить модератору
 Re: как продолжить выполнения скрипта после возникновения ошибки?!  [new]
Веселов Константин
Member

Откуда: Новосибирск
Сообщений: 208
Саму ошибку погасить никак нельзя (на сервере), но при ее возникновении скрипт все равно отрабатывает до конца (см. выше)
14 апр 05, 13:26    [1468221]     Ответить | Цитировать Сообщить модератору
 Re: как продолжить выполнения скрипта после возникновения ошибки?!  [new]
Glory
Member

Откуда:
Сообщений: 104751
Веселов Константин
Саму ошибку погасить никак нельзя (на сервере), но при ее возникновении скрипт все равно отрабатывает до конца (см. выше)

Неа. Ошибка обращения к linked server валит весь бэтч
14 апр 05, 13:28    [1468236]     Ответить | Цитировать Сообщить модератору
 Re: как продолжить выполнения скрипта после возникновения ошибки?!  [new]
Веселов Константин
Member

Откуда: Новосибирск
Сообщений: 208
Опишите как Вы выполняете проверку на linked - сервере
14 апр 05, 13:31    [1468256]     Ответить | Цитировать Сообщить модератору
 Re: как продолжить выполнения скрипта после возникновения ошибки?!  [new]
profil
Member

Откуда: Москва
Сообщений: 1713
Веселов Константин
Опишите как Вы выполняете проверку на linked - сервере
я же привел скрипт..
2Glory
получается это никак нельзя обойти?
грамотно можно организовать если только на клиенте?
14 апр 05, 13:35    [1468289]     Ответить | Цитировать Сообщить модератору
 Re: как продолжить выполнения скрипта после возникновения ошибки?!  [new]
Glory
Member

Откуда:
Сообщений: 104751
Самый приблизительный способ это
exec master..xp_cmdshell 'ping <linkedserver ip or name>'

Более продвинутый способ
exec master..xp_cmdshell 'odbcping /SMyServer /Usa /PsaPassWord'

Еще более продвинутый способ использовать процедуры sp_OA* и SQLDMO для создания проверки возможности коннекта к удаленному серверу

Самый продвинутый - написать расширенную хп с тем же SQLDMO и проверкой возможности коннекта.

И наконец самый самый продвинутый - это использовать для импорта DTS :)
Ибо все предыдущие способы не гарантируют вам, что удаленный сервер будет доступен после проверки коннекта. Он же может отвалится сразу же после этой проверки
14 апр 05, 13:44    [1468360]     Ответить | Цитировать Сообщить модератору
 Re: как продолжить выполнения скрипта после возникновения ошибки?!  [new]
Веселов Константин
Member

Откуда: Новосибирск
Сообщений: 208
IF EXISTS(
	SELECT * FROM master..sysservers
	WHERE srvname = 'srvname'
) -- это проверка на существование
  -- по идее еще надо сделать проверку на возможность коннекта,
  -- пока нет мыслей как это сделать
BEGIN
	create table #tmp (TABLE_CAT sysname null, TABLE_SCHEM sysname null, TABLE_NAME sysname, TABLE_TYPE varchar(32), REMARKS varchar(254))
	insert into #tmp exec sp_tables_ex @Server_LocalName
	...
END
14 апр 05, 13:49    [1468390]     Ответить | Цитировать Сообщить модератору
 Re: как продолжить выполнения скрипта после возникновения ошибки?!  [new]
profil
Member

Откуда: Москва
Сообщений: 1713
спасибо, Glory, буду пробывать самые продвинутые методы
2 Веселов Константин
тоже спасибо
но у меня такая проверка присутствует, но она не избавляет от ситуаций, когда сервер существует, но в нем отсутствует таблица, либо нет прав на нее, да вобщем и когда удаленнй сервер не доступен...
14 апр 05, 14:13    [1468534]     Ответить | Цитировать Сообщить модератору
 Re: как продолжить выполнения скрипта после возникновения ошибки?!  [new]
profil
Member

Откуда: Москва
Сообщений: 1713
Глеб Уфимцев. г.Москва. 4 окт 2005г.
Рассылка MS SQL Server - дело тонкое...
Определение недоступности линкед-сервера

Как заставить MSSQL сервер продолжить исполнение батча или процедуры дальше, несмотря на критическую ошибку. Или как в T-SQL проверить доступность линкед-сервера.

Если у нас стоит задача в батче (или внутри процедуры) проверить доступность прилинкованного сервера, чтобы ниже по коду принять решение, использовать ли запрос к нему или обратиться к другому источнику данных, то здесь нас поджидает засада. Только успешная попытка выполнить к нему какой-либо запрос даст уверенность в его полной доступности, но любое обращение к недоступному линкед-серверу прервет исполнение батча. Существует решение использовать для проверки системные хранимые процедуры OLE-автоматизации (sp_OACreate, sp_OA_Method, …), посредством которых к текущему серверу открывается соединение объектами ADO, исполняется запрос через линкед-сервер и, по наличию ошибки, возвращается ответ. Решение замечательное и вполне работает, но имеет ряд недостатков:

  • Права на эти процедуры даны только админам, а предоставление прав на них рядовым пользователям существенно ослабит безопасность системы.
  • Приходится явно указывать пароль при SQL-авторизации.
  • Для Windows-авторизации авторизовываться будет учетная запись SQL-сервера, а не текущего пользователя, что не гарантирует успех такого соединения.
  • Не дает решения "в целом", чтобы решение можно было распространить на другой случай, где тоже требуется продолжить батч независимо от ошибки.

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

    Разберем этот вариант на примере. Исходные данные:

    	Текущий сервер - SERVER1
    Прилинкованный сервер, доступность которого нам нужно будет проверять - ну пусть будет просто LINKED

    Убеждаемся в недоступности (LINKED погашен на самом деле):

    SELECT * FROM LINKED.master.dbo.sysusers
    SELECT @@ERROR

    Получаем ошибку:

    Msg 17, Level 16, State 1, Line 1
    SQL Server does not exist or access denied.

    И не получаем значение @@ERROR так как батч прервался.

    Тогда действуем, как запланировано. На исходном сервере SERVER1 регистрируем новый линкед-сервер, причем тот же самый SERVER1, только имя линкед-сервера задаем "LOOPBACK", и убеждаемся в его работоспособности. Главное, чтобы название прилинкованного сервера было отличным от родного имени сервера, которого он представляет на самом деле. Этого можно добиться различными путями. Самый простой из них - в Client Network Utility зарегистрируем алиас "LOOPBACK" на сервер "SERVER1" и в настройках линкед-сервера укажем сервер LOOPBACK. Через этот сервер и пропустим запрос.

    EXEC LOOPBACK...sp_executesql 
    N'SELECT * FROM LINKED.master.dbo.sysusers'
    SELECT @@ERROR


    Получили приятный ответ:


    Msg 17, Level 16, State 1, Line 1
    SQL Server does not exist or access denied.

    -----------
    17

    (1 row(s) affected)

    Как мы видим, батч не прервался, и мы получили значение @@ERROR, которое можно в дальнейшем использовать для анализа.
  • 19 окт 05, 02:02    [1981913]     Ответить | Цитировать Сообщить модератору
    Между сообщениями интервал более 1 года.
     Re: как продолжить выполнения скрипта после возникновения ошибки?!  [new]
    Durist
    Guest
    Попробовал обозначенную технологии в приведенной статье. Действительно пакет продолжает работать, не останавливается. Но у меня возвращается вот такое сообщение

    Msg 53, Level 16, State 1, Line 0
    Named Pipes Provider: Could not open a connection to SQL Server [53].

    а select @@ERROR
    возвращает 0. Т.е. в результате не могу понять доступен ли сервера :(
    Обращался к серверу прилинкованному, но которого заведома нет в сети.
    Подскажите, где грабли?
    30 ноя 06, 15:20    [3473756]     Ответить | Цитировать Сообщить модератору
     Re: как продолжить выполнения скрипта после возникновения ошибки?!  [new]
    Durist
    Guest
    Сорри, забыл сказать. У меня Microsoft SQL Server 2005 - 9.00.2153.00
    30 ноя 06, 15:22    [3473768]     Ответить | Цитировать Сообщить модератору
     Re: как продолжить выполнения скрипта после возникновения ошибки?!  [new]
    iap
    Member

    Откуда: Москва
    Сообщений: 47052
    Определение недоступности линкед-сервера
    30 ноя 06, 15:38    [3473924]     Ответить | Цитировать Сообщить модератору
     Re: как продолжить выполнения скрипта после возникновения ошибки?!  [new]
    Durist
    Guest
    Ну и зачем ссылку давать на ту же самую статью? Читал я ее. Вдохновился.
    Попробовал. НО в @@ERROR 0 получаю!!!!
    30 ноя 06, 16:05    [3474179]     Ответить | Цитировать Сообщить модератору
     Re: как продолжить выполнения скрипта после возникновения ошибки?!  [new]
    -=DiM@n=-
    Member

    Откуда: Москва
    Сообщений: 1564
    В 2005 есть процедура sp_testlinkedserver, которая как раз проверяет соединение со связанным сервером.
    DECLARE @ret int;
    
    EXEC @ret = sp_testlinkedserver 
             @servername = LinkServerName;
    
    IF @ret = 0
       PRINT 'На связи :0)';
    ELSE
       PRINT 'Нет связи :0(';
    
    30 ноя 06, 16:42    [3474527]     Ответить | Цитировать Сообщить модератору
     Re: как продолжить выполнения скрипта после возникновения ошибки?!  [new]
    Durist
    Guest
    Спасибо -=DiM@n=- .
    Блин, век живи, век учись...
    1 дек 06, 10:30    [3477186]     Ответить | Цитировать Сообщить модератору
    Между сообщениями интервал более 1 года.
     Re: как продолжить выполнения скрипта после возникновения ошибки?!  [new]
    MakPol
    Member

    Откуда:
    Сообщений: 101
    Правильно я понимаю, что проверка доступности при помощи sp_testlinkedserver осуществляется не моментально? У меня, например при попытке проверить доступность 1:46 (1 минуту 46 секунд) думает, а только потом выводит сообщение:
    автор
    OLE DB provider "SQLNCLI10" for linked server "SERV-116" returned message "Login timeout expired".
    OLE DB provider "SQLNCLI10" for linked server "SERV-116" returned message "A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not accessible. Check if instance name is correct and if SQL Server is configured to allow remote connections. For more information see SQL Server Books Online.".
    Сообщение 53, уровень 16, состояние 1, строка 0
    Named Pipes Provider: Could not open a connection to SQL Server [53].

    Правда если указать несуществующий линкедсервер тогда тут же ругнется.

    Правильно я понимаю, что все это зависит от времени ожидания соединения?
    17 мар 15, 16:26    [17395535]     Ответить | Цитировать Сообщить модератору
     Re: как продолжить выполнения скрипта после возникновения ошибки?!  [new]
    Владислав Колосов
    Member

    Откуда:
    Сообщений: 8350
    MakPol, время ожидание на каждый активный протокол.
    17 мар 15, 16:44    [17395621]     Ответить | Цитировать Сообщить модератору
     Re: как продолжить выполнения скрипта после возникновения ошибки?!  [new]
    MakPol
    Member

    Откуда:
    Сообщений: 101
    А есть способ проверить моментально доступен сервер или нет? Я предполагал, что это и есть sp_testlinkedserver, но при недоступности он выдает ошибку, вместо того чтобы вернуть код ошибки. Я тогда не совсем понимаю как в случае недоступности линкедсервера правильно проверить.
    17 мар 15, 16:55    [17395684]     Ответить | Цитировать Сообщить модератору
     Re: как продолжить выполнения скрипта после возникновения ошибки?!  [new]
    Glory
    Member

    Откуда:
    Сообщений: 104751
    MakPol
    А есть способ проверить моментально доступен сервер или нет?

    Как вы себе это представляете, если процесс установления соединения проходит в несколько шагов ?
    Пропустить некоторые из них, не дожидаясь завершения ?
    17 мар 15, 17:09    [17395761]     Ответить | Цитировать Сообщить модератору
     Re: как продолжить выполнения скрипта после возникновения ошибки?!  [new]
    o-o
    Guest
    MakPol
    Я предполагал, что это и есть sp_testlinkedserver, но при недоступности он выдает ошибку, вместо того чтобы вернуть код ошибки. Я тогда не совсем понимаю как в случае недоступности линкедсервера правильно проверить.

    сами верните себе номер ошибки и/или сообщение:
    begin try
       exec sp_testlinkedserver @servername = ...;
       select 'ok'
    end try
    
    begin catch
       set @err = ERROR_MESSAGE();
       --raiserror(@err, 10, 1); 
       select ERROR_NUMBER() ,@err;  
    end catch
    

    проблема же была, что batch прерывался...
    17 мар 15, 19:10    [17396320]     Ответить | Цитировать Сообщить модератору
     Re: как продолжить выполнения скрипта после возникновения ошибки?!  [new]
    MakPol
    Member

    Откуда:
    Сообщений: 101
    Да, абсолютно верно, я в топике устроил офтоп отодя от темы изначальной. Прошу прощения. Просто увлекся. Попробую найти другой способ чтобы быстро проверить доступность 100 с лишним разнесенных по разным площадкам серверов. После проверки на доступных через rpc буду выполнять действия. Большое спасибо за ответы.
    17 мар 15, 21:35    [17396795]     Ответить | Цитировать Сообщить модератору
     Re: как продолжить выполнения скрипта после возникновения ошибки?!  [new]
    Glory
    Member

    Откуда:
    Сообщений: 104751
    MakPol
    . После проверки на доступных через rpc буду выполнять действия

    https://msdn.microsoft.com/en-us/library/ms180992.aspx
    17 мар 15, 21:58    [17396842]     Ответить | Цитировать Сообщить модератору
     Re: как продолжить выполнения скрипта после возникновения ошибки?!  [new]
    Winnipuh
    Member [заблокирован]

    Откуда: Київ
    Сообщений: 10428
    MakPol
    Да, абсолютно верно, я в топике устроил офтоп отодя от темы изначальной. Прошу прощения. Просто увлекся. Попробую найти другой способ чтобы быстро проверить доступность 100 с лишним разнесенных по разным площадкам серверов. После проверки на доступных через rpc буду выполнять действия. Большое спасибо за ответы.


    вы видимо ткскыть жертва собственной же терминоглогии

    "быстро проверить доступность" - это что?

    есть ли такой сервер? можно ли к нему подключиться клиенту? Ну так здесь и будут накладные расходы на установку коннекта, таймауты и пр.
    Елси же просто типа пинга, то это только необходимое условие.
    Напишите SQL CLR или отдельную утилиту, которая в несколько потоков будет проверять вашу сотню и т.д.
    18 мар 15, 11:33    [17398447]     Ответить | Цитировать Сообщить модератору
    Все форумы / Microsoft SQL Server Ответить