Форум: "Базы";
Текущий архив: 2005.10.16;
Скачать: [xml.tar.bz2];
ВнизКак найти (все) MSSQL серверы в локальной сети Найти похожие ветки
← →
tanya (2005-07-29 15:47) [0]Как получить список имён серверов MSSQL, имеющихся в локальной сети (D7,ADO,MSSQL).
Нужно, чтобы пользователь из одного окна мог логиниться к разным базам на разных серверах, но при этом поднимать ADO-шные окна подключения или connectionstring совсем ни к чему. Как бы собрать только список имен серверов?
← →
Reindeer Moss Eater © (2005-07-29 15:52) [1]Список зарегистрированных в MSSQL-клиенте MSSQL серверов лежит в реестре. Читай отуда.
← →
Fay © (2005-07-29 15:54) [2]2 tanya (29.07.05 15:47)
1) SQL-DMO
2) NetServerEnum
← →
Anatoly Podgoretsky © (2005-07-29 16:35) [3]Все найти нельзя, а что клиенту все равно к какому серверу подключаться, лишь бы подключиться.
← →
sniknik © (2005-07-29 17:05) [4]Fay © (29.07.05 15:54) [2]
+
odbs32.dll SQLBrowseConnect
но все сервера в сети ни один метод не возьмет.
← →
AxelBlack (2005-07-29 19:10) [5]sniknik © (29.07.05 17:05) [4]
+
"SQLOLEDB Enumerator", хотя он использует NetServerEnum
+
выполнить эту команду с уже законнектенного сервера: "exec master..xp_cmdshell "osql -L""
← →
tanya (2005-08-30 18:11) [6]Что пробовала:
1) SQLDMO.ListAvailableSQLServers - к сожалению возвращает не только список всех MSSQL серверов, но ещё и до кучи все MSDE подтягивает (это MS desktop engine, они совсем тут ни к чему, но как их исключить я не знаю). И кстати, очень медленно...
2)NetServerEnum (ServType=SV_TYPE_SQLSERVER) - существенно быстрее, но всё равно выдаёт кроме серверов ещё и MSDE :-(. Ну и кроме того выдаёт не имена серверов, а имена компьютеров (а для локальных MS серверов имя должно формироваться как "имя станции\локальное имя сервера")
3)odbs32.dll SQLBrowseConnect - НЕ пробовала. Смущает то, что в настройках DSN при выборе сервера предлагается всё тот же список с кучей не нужных MSDE. Думаю, что это список и вернёт SQLBrowseConnect...
4)"exec master..xp_cmdshell "osql -L"" - та же история с MSDE(правда я параметры совсем не смотрела)
А нужно получить ровно тот список, который предлагается в MS SQL Server Query Analyzer и Enterprice Manager - конкретно серверов.
4)Читать из реестра. Пока это единственный вариант решения, но вот если нашлось бы решение с SQLDMO - это было бы предпочтительнее...
Пока я так поняла, что то, что мне надо - это не AvailableSQLServers, а ServerGroups, но к успеху это меня не привело...
2 Anatoly Podgoretsky
>а что клиенту все равно к какому серверу подключаться,
>лишь бы подключиться.
Клиенту "очень не всё равно" к какому серверу подключиться - очень хочется подключится к совершенно конкретному, а их несколько...Например, есть рабочая база, есть тестовые копии рабочей базы. Структура одинаковая, задачи разные... На одной работать, на другой отлаживаться :-) А клиентский интерфейс один...
← →
DiamondShark © (2005-08-30 22:28) [7]
> к сожалению возвращает не только список всех MSSQL серверов,
> но ещё и до кучи все MSDE подтягивает
И правильно делает, потому что по сетевому интерфейсу они ничем не отличаются.
> одной работать, на другой отлаживаться :-) А клиентский
> интерфейс один...
Я делал так: имя сервера можно либо ввести руками, либо выбрать из списка доступных серверов.
Имя выбранного сервера сохраняется между запусками программы, так что в следующий раз можно просто выбрать имя из списка ранее выбранных серверов, без запроса к сети.
← →
Sam Stone © (2005-08-30 23:22) [8]А что, пользователи не знают, какой сервер тестовый, а какой рабочий? Или они так часто меняются? Если нет, то можно либо в на каком-либо компе хранить список имеющихся серверов (один раз забить ручками), либо этот список хранить на каждом компе.
← →
Anatoly Podgoretsky © (2005-08-31 00:02) [9]tanya (30.08.05 18:11) [6]
Для этого достаточно держать список в файле, например ИНИ и совсем ни к чему опрашивать сеть. И решишь попутно и другие проблемв с идентификацией, с комментариями, все что посчитаешь нужным. Это позволит иметь удобный пользователю интерфейс.
← →
tanya (2005-08-31 11:09) [10]2 DiamondShark [7]
>> но ещё и до кучи все MSDE подтягивает
>И правильно делает, потому что по сетевому интерфейсу
>они ничем не отличаются.
И тем не менее MS SQL Server Query Analyzer и Enterprice Manager их очень даже отличают! А именно не показывают MSDE ни в списках выбора, ни в combobox, ни в object browser :-) Персональный - так персональный!
2 ALL
Ну конечно, у меня всего два сервера, и я спокойно могу и ввести их имена руками, и считать из ini и т.д. (второй сервер заведён для того, чтобы не грузить рабочий тестовыми задачами).
Т.е. в моём контексте - вопрос спортивный.
НО например, для коммерческих приложений, требовать от пользователя конфигурировать ini, когда можно самому получить нужную информацию, было бы странно.
И, кстати, если интересно, у меня уже что-то получается через SQL-DMO:
очень сильно изначально сбил, предлагаемый всеми в инете метод dmoApp.ListAvailableSQLServers. А сначала надо было самой на объектную модель посмотреть :-( И тогда решение получается вложенным циклом -
внешний по dmoApp.ServerGroups
и внутренний по dmoApp.ServerGroups.item(i).RegisteredServers Ну и тогда имена нужных серверов -
dmoApp.ServerGroups.item(i).RegisteredServers.item(j).Name
(У себя в реестре нужный список нашла в HKEY_CURRENT_USER и в HKEY_USERS в четырёх местах)
Лично я пока остановлюсь на SQLDMO.
И если кто дочитал :-), то у меня ещё один вопрос:
А как формально определить системные DB?
(Хотелось бы ещё из списка выбора баз сервера исключить системные базы)
Я знаю, что их 4 (The system databases are master, model, msdb, and tempdb). И, конечно, могу удалить эти strings из списка.
Но м.б. есть какое-нибудь property на эту тему?
← →
Nikolay M. © (2005-08-31 11:46) [11]
> НО например, для коммерческих приложений, требовать от пользователя
> конфигурировать ini, когда можно самому получить нужную
> информацию, было бы странно.
Совсем не странно. Diasoft 5NT, например, хоть и является ужасом, летящим на крыльях ночи, но при входе в систему предлагает либо список из ini, либо ввести новый сервер. А вот заставлять юзера каждый раз ждать, пока вы ищете сервера - это неправильно.
> А как формально определить системные DB?
Смотря что считать "системными". Например, как видно из результата запросаSELECT *
FROM master..sysdatabases
база Northwind (если она у вас не удалена) создана пользователем sa примерно в одно и то же время, что и master (при инсталляции сервера). Что есть системная база, а что - нет?
← →
paul_k © (2005-08-31 12:39) [12]А ещё модно в Actve Directory порытся.
Nikolay M. © (31.08.05 11:46) [11]
Смотря что считать "системными".
master,tempdb,model
а что ещё?
> НО например, для коммерческих приложений, требовать от
> пользователя конфигурировать ini, когда можно самому
> получить нужную информацию, было бы странно.
ничего странного. У пользователя должен быть специалист, который способен установить сервер, создать базу, установить Вашу программу и сконфигурить необходимые инишки на клиенте.
← →
tanya (2005-08-31 12:59) [13]2 Nikolay M. [11]
Пока у меня dmoApp.ServerGroups..RegisteredServers.. вполне быстро отрабатывает. Существенно быстрее, чем dmoApp.ListAvailableSQLServers.
Конечно, оценить скорость этой конструкции на различных конфигурациях не могу... Но, есть подозрение что при этом не происходит опроса сети! Подозрение основано на том, что
1. очень быстро;
2. ветки реестра с нужным списком как раз оканчиваются на "\Registered Servers X\SQL Server Group"
Ну а считывание из реестра - то же, что и из ini (только лучше:-)
>Смотря что считать "системными".
Из help:
"The system databases are master, model, msdb, and tempdb. The sample databases, pubs and Northwind, are provided as learning tools."
Я попробовала так:use master
select dbid, DB_NAME(dbid) AS DBNAME
from sysdatabases where dbid>4
Потому как про первые 4 (системные) можно быть вполне уверенным, что они "первые четыре". А вот уже две (учебные) вполне могут быть удалены, да и прямой доступ к ним никому не заказан...
← →
paul_k © (2005-08-31 13:05) [14]http://www.sql.ru/forum/actualthread.aspx?tid=741&hl=adsi
← →
Nikolay M. © (2005-08-31 13:19) [15]
> >Смотря что считать "системными".
> Из help:
> "The system databases are master, model, msdb, and tempdb.
> The sample databases, pubs and Northwind, are provided as
> learning tools."
Если все так просто, тогда зачем в [10] вопрос о нахождении системных БД?
> paul_k © (31.08.05 12:39) [12]
> Смотря что считать "системными".
> master,tempdb,model
> а что ещё?
msdb.
← →
Anatoly Podgoretsky © (2005-08-31 13:37) [16]tanya (31.08.05 11:09) [10]
НО например, для коммерческих приложений, требовать от пользователя конфигурировать ini, когда можно самому получить нужную информацию, было бы странно.
Мне странным кажется другое, именно предоствлять пользователю случайную недерменированую информацию. Это вопрос серьезный. Если есть сервера, то должен быть и админстратор, который решит на какой сервер устанавливать базу. Вопрос к тому же сильно завязан на безопасность и права, кто это позволит кому то устанвливать базу на сервера.
← →
tanya (2005-08-31 14:02) [17]2 Nikolay M. [15]
> Если все так просто, тогда зачем в [10] вопрос о нахождении
> системных БД?
Николай, я в [10] спрашивала о наличии у этих объектов какого-нибудь свойства, определяющего, что это системные базы. Но не уточнила, что спрашиваю про свойства, кроме имени :-)
← →
tanya (2005-08-31 14:25) [18]2 Anatoly Podgoretsky [16]
Анатолий, я уже извинялась, что в моём случае - вопрос просто спортивный.
Но и комерческие приложения могут быть разными: админские средства, всякие Db explorer... Например, якобы, SQL Server Enterprise Manager "написан на" sqldmo. (люди пишут, что осознав sqldmo они забыли про Enterprise Manager)
> Если есть сервера, то должен быть и админстратор
Я считаю, если какая-то информация однозначно программно определяется в среде без ini, то использование в таких случаях ini - вредная избыточность.
У нас есть админ (именно он перевёл всю мою разработку на второй сервер, а работу оставил на первом :-), НО НЕ ОН отрисовывает мне дерево объектов в Enterprise Manager, или Query Analyzer :-)
Админу - админово, а "автоматизатору" - всё остальное...
← →
Nikolay M. © (2005-08-31 14:59) [19]
> tanya (31.08.05 14:02) [17]
> Николай, я в [10] спрашивала о наличии у этих объектов какого-нибудь
> свойства, определяющего, что это системные базы. Но не уточнила,
> что спрашиваю про свойства, кроме имени :-)
AFAIK, у базы такого свойства нет.
← →
Nikolay M. © (2005-08-31 14:59) [20]
> tanya (31.08.05 14:02) [17]
> Николай, я в [10] спрашивала о наличии у этих объектов какого-нибудь
> свойства, определяющего, что это системные базы. Но не уточнила,
> что спрашиваю про свойства, кроме имени :-)
AFAIK, у базы такого свойства нет.
← →
Anatoly Podgoretsky © (2005-08-31 15:46) [21]tanya (31.08.05 14:25) [18]
Ну разве про подобное я спорю, ты просто по ходу уточняешь задачу. Если речь про пользователей то это одно, а инструмент для администраторов это другое. Я говорю про первое. Не надо пользователю вываливать список всех доступных серверов, ему лучше дать список только нужного и с комментарием характеристикой.
← →
tanya (2005-08-31 19:10) [22]Да я, в общем то, со всеми замечаниями согласна. Пользователю надо предоставлять только интерфейс к регламентированным его работой функциям.
Но хотеть знать, как оно всё устроено, не вредно?
А я в результате этого длинного обсуждения кое-что для себя узнала, да задачу свою решила.
Всем спасибо!
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2005.10.16;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.054 c