Просмотр для серверов SQL
Я пишу приложение базы данных, которое подключается к серверу SQL. Я хотел бы реализовать подобное диалоговое окно подключения, как в SQL Management Studio. Я уже нашел способ получить список баз данных на сервере, но мне бы очень хотелось получить список доступных серверов в сети, чтобы конечным пользователям не приходилось вводить имя /IP-адрес сервера,
7 ответов
CREATE PROCEDURE dbo.ListLocalServers
AS
BEGIN
SET NOCOUNT ON
CREATE TABLE #servers(sname VARCHAR(255))
INSERT #servers EXEC master..XP_CMDShell 'OSQL -L'
-- play with ISQL -L too, results differ slightly
DELETE #servers WHERE sname='Servers:'
SELECT LTRIM(sname) FROM #servers WHERE sname != 'NULL'
DROP TABLE #servers
END
Альтернативный метод SQL DMO здесь
Ваше лучшее предположение будет заполнить список заранее, если вы можете.
Сканирование сети на наличие SQL-серверов, вероятно, не лучшая идея (медленная, ненадежная).
Если вы разрабатываете свою программу в.Net, вы можете использовать объекты SMO для этого. Используйте метод Microsoft.SqlServer.Management.Smo.SmoApplication.EnumAvailableSqlServers, чтобы получить список всех серверов sql, работающих в вашей локальной сети.
Сканирование занимает несколько секунд, но оно не очень медленное.
Для начала можно получить монитор MS Network и посмотреть, что он делает, если щелкнуть раскрывающийся список в MSSMS.
Я предполагаю (с задержкой, когда вы нажимаете этот выпадающий список), что он опрашивает локальную сеть.
Сказав это, в моем офисе, кажется, опрашивает не только локальную сеть, поскольку она получает серверы, которые находятся внутри корпоративной сети, но в других подсетях.
Удачи
Инструмент SQLPing от sqlsecurity.com. Более старые версии загрузок содержат исходный код, который может быть полезен.
По сути, вам нужно запрашивать порт 1434 UDP на каждом IP-адресе в вашей сети. Тем не менее, брандмауэры и политики будут блокировать это.
Примечание. 1434 - это место, где вы перечисляете экземпляры SQL на сервере. Если вы используете только экземпляры по умолчанию, то порт 1433 подойдет. Если только он не "спрятан" в порту 2433...
Не уверен, что существует правильный способ, но одним из способов было бы попытаться подключиться к порту 1433 (порт mssqlserver по умолчанию) к компьютерам в вашей сети.