Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как средствами T-SQL определить , что linked server доступен ? / 19 сообщений из 19, страница 1 из 1
24.04.2002, 05:07
    #32028607
Gregory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как средствами T-SQL определить , что linked server доступен ?
Повторно пытаюсь выяснить, может кто подскажет дельное... Задача простая :
- имеется linked server определенный на моем сервере (SQL Server 2000) ;
- по его имени я определяю, что соответствующий КОМПЬЮТЕР в сети;
- однако, если на том компьютере НЕ ЗАПУЩЕН SQL Server или MSDE, любой запрос к нему с моего сервера, есссно, обваливается.
Печальней всего, что при этом не формируется значение @@error !! А если вызов где-то глубоко по стеку вложенных процедур, то обваливается так весь стек ! Как все-таки заставить SQL формировать "нормальный" ответ. И нет ли какого-то средства ( хранимой процедуры ) выполняющей определение доступности linked server'а.
На всякий случай - работаю в домейне W2K, SQL Server (RTM) 8.00.194, MDTC запущен. В BOL , увы, ничего не нашел. Плохо искал ?
...
Рейтинг: 0 / 0
24.04.2002, 07:21
    #32028625
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как средствами T-SQL определить , что linked server доступен ?
Утилита odbcping
...
Рейтинг: 0 / 0
24.04.2002, 08:11
    #32028633
Gregory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как средствами T-SQL определить , что linked server доступен ?
2Glory : Большое спасибо !
...
Рейтинг: 0 / 0
24.04.2002, 20:19
    #32028697
Александр Третьяков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как средствами T-SQL определить , что linked server доступен ?
Gregory
как вы по имени определяете, что соответствующий КОМПЬЮТЕР в сети?
...
Рейтинг: 0 / 0
25.04.2002, 03:58
    #32028720
Gregory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как средствами T-SQL определить , что linked server доступен ?
Делаю на него PING по имени компьютера. Результаты кладу во временную таблицу и анализирую ее содержание.
...
Рейтинг: 0 / 0
25.04.2002, 18:24
    #32028856
Александр Третьяков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как средствами T-SQL определить , что linked server доступен ?
Gregory
Если не сложно можно пример кода, я пробовал через xp_cmdshell 'ping 192.192.192.192', результат вижу, но как его в таблицу засунуть на ходу не знаю.
И второе если механизм проверки link server'а чемто вроде:
select * from linkedserver.master.dbo.table
if @@error!=0
begin
select * from master.dbo.dublikattable
end
потому-что xp_cmdshell 'ping 192.192.192.192' выполняется 3 секунды, а хотелось бы проверить наличие почти мгновенно.
...
Рейтинг: 0 / 0
28.04.2002, 05:57
    #32029094
Gregory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как средствами T-SQL определить , что linked server доступен ?
2Александр Третьяков
1). "пример кода" :
...
CREATE TABLE #TBLPING ([idx] [int] IDENTITY (1,1) NOT NULL,
[val] [varchar] (8000) NULL )
set @rabStr='PING ' + @LinkServer
INSERT INTO #TBLPING (val) EXEC master..xp_cmdshell @Val = @rabStr
if exists(SELECT * FROM #TBLPING WHERE val LIKE '%Unknown host %')
set @message='Нет связи с linked server"ом '
else
begin
Delete #TBLPING
set @rabStr='ODBCPING /S' + @LinkServer+' /Usa '
INSERT INTO #TBLPING (val) EXEC master..xp_cmdshell @Val = @rabStr
if exists(SELECT * FROM #TBLPING WHERE val LIKE '%COULD NOT CONNECT TO SQL SERVER%')
set @message='Linked server не отзывается.'
else ...
и не забыть в конце
drop table #TBLPING

2)."И второе если механизм проверки link server'а чемто вроде:
select * from linkedserver.master.dbo.table ..."
У меня подобное шло около 23 секунд и кончалось обвалом процедуры, в которой подобным образом действовал. Прекращалась обработка всего стека процедур над ней ! И никакой ошибки @@error не возвращалось.
Насчет "мгновенно" - большие сормнения , а время обработки соответствующих команд в сети и время реакции на поиск и ответ SQL Server куда может подеваться ?
...
Рейтинг: 0 / 0
02.05.2002, 17:09
    #32029401
Александр Третьяков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как средствами T-SQL определить , что linked server доступен ?
Gregory Спасибо за примеры кода,
но я вот думаю и мечтаю открываю Enterprise Manager и вижу как плавно загораються зеленые уголки около связаные серверов, и посещяють меня мысли как это ОН делает?, я тоже так хочу.
А если без шуток должон быть механизм какой то готовый, мы не первые.
...
Рейтинг: 0 / 0
02.05.2002, 19:45
    #32029410
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как средствами T-SQL определить , что linked server доступен ?
потому-что xp_cmdshell 'ping 192.192.192.192' выполняется 3 секунды, а хотелось бы проверить наличие почти мгновенно.

IMHO в данном случае больше время тратится на загрузку command.com и затем на возврат вывода выполненных команд. Если вы напишите расширенную хранимую процедуру, то думую, что время выполнения будет почти "мгновенным"
...
Рейтинг: 0 / 0
02.05.2002, 22:16
    #32029415
bik_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как средствами T-SQL определить , что linked server доступен ?
Небольшая поправка

MS SQL Server 2000 запускает cmd.exe, если работает на Windows NT/2000,
и cmdwrap.exe в противном случае (а он, cmdwrap.exe, вызывает command.com).

Что касается Ping, то именно он и "съедает" 3 секунды, т.к. времена,
затрачиваемые на сетевые коммуникации самые большие.

Если бы 3 сек уходило на загрузку командного интерпретатора и возврат
вывода выполненных команд, то любой вызов xp_cmdshell требовал
бы нескольких секунд...
...
Рейтинг: 0 / 0
06.05.2002, 08:26
    #32029534
Александр Третьяков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как средствами T-SQL определить , что linked server доступен ?
Glory и bik_ я думаю проблема, если можно ее назвать так, заключена в двух:
1. время потраченое на загрузку command.com (не очень большое xp_cmdshell 'dir c:\*.*' работает неплохо, но можно переделать)
2. время потраченое на ping, даже и под командной строки тратиться порядка 3с, именно здесь задержка.
Нужен механизм "мгновенной проверки", механизм в отличие от ping не проверяющий прохождение пакетов указаной длины 3 раза. Я понимаю сеть это узкое место, но ... надо как то с этим бороться. Выход должен быть всегда. Glory я не исключаю возможности написать новою разширеную хранимую процедуру, но с помощью какого механизма, как сделать мгновенный ping?
...
Рейтинг: 0 / 0
06.05.2002, 08:34
    #32029536
bik_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как средствами T-SQL определить , что linked server доступен ?
2Александр Третьяков:

Сорри, но твой последний пост я не могу даже комментировать...

Может это облегчит жизнь народу:

code:ping -n 1 MyHost
...
Рейтинг: 0 / 0
08.05.2002, 23:23
    #32029808
Как средствами T-SQL определить , что linked server доступен ?
bik_ я понимаю, что можно уменьшить количество проверок до одной и можно уменьшить размер пакета, но ... . Когда мы открываем Enterprise Manager, то зеленые квадратики возле серверов загораються очень даже быстро (у меня сервера разбросаны по городу и скорость между ними 144кб), посоветуюсь на досуге с сетевиками и если что надумаю напишу сюда. Попробую сделать что-то вроде:
if existsserver('192.168.1.1')
begin
select * from [192.168.1.1].master.dbo.table
end
else
begin
select * from master.dbo.tabledublicat
end
...
Рейтинг: 0 / 0
09.05.2002, 09:53
    #32029812
bik_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как средствами T-SQL определить , что linked server доступен ?
2Алекандр Третьяков:

Когда мы открываем Enterprise Manager, то зеленые квадратики возле серверов загораються очень даже быстро (у меня сервера разбросаны по городу и скорость между ними 144кб), посоветуюсь на досуге с сетевиками и если что надумаю напишу сюда.

EM "рисует зеленые квадратики" тогда, когда ему удается опросить удаленный сервер по SMB на предмет того,
что сервис MSSQLServer запущен. Кроме того, еще EM пытается опросить удаленный сервис "SQL Listener" что слушает на UDP 1434
и возвращает описание сервера (то же, что делают isql -L, sqlping и т.п.). Так вот, чтобы тебе все это сделать, придется:

1. НаписАть Extended Stored Procedure, которая бы опрашивала удаленную машину на предмет того, запущен ли сервис MSSQLServer
2. Открыть SMB порты для этого (они, судя по всему уже открыты ), что плохо для security


Либо пытаться соединиться с удаленным сервером. Этот способ самый правильный. Завтра приведу
пример кода для такой процедуры.
...
Рейтинг: 0 / 0
09.05.2002, 20:24
    #32029824
Александр Третьяков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как средствами T-SQL определить , что linked server доступен ?
bik_ я буду благодарен за пример кода, и если можно подробнее про SMB порты?
...
Рейтинг: 0 / 0
13.05.2002, 13:58
    #32029991
RatTail
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как средствами T-SQL определить , что linked server доступен ?
Может пригодится...
<a>http://www.sqlmag.com/Articles/Index.cfm?ArticleID=14327&action=showfaq</a>

Q. How can I list all available SQL Servers in my application?

A. Two methods :-

1. The ISQL and OSQL commands have a -L option to list servers. This can then be run from xp_cmdshell.

Exec master..xp_cmdshell 'ISQL -L'
Exec master..xp_cmdshell 'OSQL -L'


2. Use SQL-DMO. The method/api is ListAvailableSQLServers. This returns a NameList object enumerating network-visible SQL Servers.

Details on DMO are provided in the Books-Online and/or a separate help file. These are installed as part of any SQL Server install.

A detailed example is below :-

To enumerate all network-visible SQL servers using SQL-DMO objects, create a new standard EXE project and add a reference to sqldmo.rll. This file can be found in \Binn\Resources\1033\sqldmo.rll under the SqlServer70
directory.

Now add this code and declaration in your form's code:

Private Function GetAllSqlServerCollection(colSqlServers As Collection)
As
Boolean
Dim intIndex As Integer
Dim oApplication As SQLDMO.Application
Dim oNameList As SQLDMO.NameList

Set oApplication = New Application
With oApplication
Set oNameList = .ListAvailableSQLServers
With oNameList
For intIndex = 1 To .Count
colSqlServers.Add (oNameList.Item(intIndex))
Next
End With
End With
Set oApplication = Nothing
GetAllSqlServerCollection = True
End Function

This code quickly fetches a list of SQL servers and can be put inside a combo box's drop-down event to always get a refreshed list of SQL servers on your form.
...
Рейтинг: 0 / 0
13.05.2002, 14:13
    #32029995
RatTail
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как средствами T-SQL определить , что linked server доступен ?
Прошу прощения, забыл аттрибут HREF указать...
...
Рейтинг: 0 / 0
13.05.2002, 21:35
    #32030029
Александр Третьяков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как средствами T-SQL определить , что linked server доступен ?
Спасибо за ответ RatTai, будем пробовать.
Есть еще одна проблемка, определили что linked server доступен, начали качать данные(нужно на перекачку 3 секунды), через 1.5 секунды канал упал (обрыв связи), SQL Server начинает мутить около 15-20 секунд, аж потом говорит, что все. @error=0, ошибки нет , и мутит долго.
Общался с сетевиками говорят: а) мгновенных проверок не бывает; б) особенно при нестабильных каналах. Короче пробую и проверяю. Еще раз спасибо RatTai.
...
Рейтинг: 0 / 0
16.05.2002, 00:16
    #32030281
LYNX_DBA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как средствами T-SQL определить , что linked server доступен ?
Можно еще вот такую процедульку использовать (базируется на вызове SQLDMO из T-SQL в sql7 работает в 2000 не проверял.
Если сервер присутствует - ответ получается быстро - если нет - то таймаут. Тут уж ничего не попишешь).

CREATE PROCEDURE [sp_storage_test_connection]
@srv_name varchar(255),
@login varchar(255),
@password varchar(255),
@ret varchar(255) OUT

AS
BEGIN
declare @object int
declare @hr int

select @ret = 'False'
EXEC @hr = sp_OACreate 'SQLDMO.SQLServer', @object OUT
EXEC @hr = sp_OAMethod @object, 'Connect', NULL, @srv_name, @login, @password
EXEC @hr = sp_OAMethod @object, 'VerifyConnection', @ret OUT
EXEC @hr = sp_OADestroy @object

END
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как средствами T-SQL определить , что linked server доступен ? / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]