Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2007.01.14;
Скачать: [xml.tar.bz2];

Вниз

Каким образом можно получить список баз данных сервера   Найти похожие ветки 

 
logslava   (2006-10-26 17:21) [0]

допустим я хочу вывести список баз данных на сервере Server (пока только лишь получить этот список без всяких там коннектов)...

1. Нужно ли мне для этого использовать АДОКоннекшн? Каким образом его использовать тогда?

2. Если в дизайн-тайме дважды щелкнуть по АДОКоннекшену - откроется окно с параметрами подключения, - можно ли каким-нибудь образом вызвать это окно в ран-тайм? (Помоему - меня терзают смутные сомнения - я когда-то где-то сталкивался с процедурой/функцией, вызывающей его)

3. каким образом сам дэлф получает список баз данных в этом окне?
Допустим надо ввести провайдера, сервер, логин и пароль..
но даже если сделать совершенно "бесправного" юзера в SQLServer, даже для такого логина все равно отобразится список баз данных - ?
В Мастере есть табличка с базами данных, но надо еще к Мастеру подключиться, ведь мой "бесправный" не знает пароля к Мастеру...


 
stone ©   (2006-10-26 17:32) [1]


> logslava   (26.10.06 17:21)  

Лучше по-порядку

> допустим я хочу вывести список баз данных на сервере Server
> (пока только лишь получить этот список без всяких там коннектов).
> ..
>
> 1. Нужно ли мне для этого использовать АДОКоннекшн? Каким
> образом его использовать тогда?

Чтобы получить список баз, нужно сначала подключиться к серверу. Использовать АДО или что-то другое твое дело.


 
logslava   (2006-10-26 17:38) [2]

уточняю: использую АДО, но в методах АДОКоннекшена я не нашел ничего подходящего.
 Таким образом первый вопрос следовало бы задать так: _можно ли_ с помощью АДО получить этот пресловутый список?

у меня есть только такой ответ: можно подключиться к Мастеру, из таблицы sysdatabases запросом выбрать то, что мне надо - НО это лишь при условии, что я знаю пароль к Мастеру, так ведь?


 
isasa ©   (2006-10-26 17:58) [3]

TADOConnection.GetTableNames

Populates a string list with the names of tables in the database.

procedure GetTableNames(List: TStrings; SystemTables: Boolean = False);


 
logslava   (2006-10-26 18:02) [4]


> isasa ©   (26.10.06 17:58) [3]


GetTableNames мне известна, только она возвращает список таблиц в базе, а мне надо список баз на сервере


 
Anatoly Podgoretsky ©   (2006-10-26 18:24) [5]

Тут надо использовать SQLDMO и вроде должен быть запущен MSSQL Agent (порт 1434) - не уверен.

Но меня всегда удивляло, зачем это нужно, кто же тебя пустит в чужую базу, а свои и так знаешь.
Тут надо подходить по другому, вместа хаканья чужих баз, вести список своих. Вот от такого списка может быть какая то польза.


 
dr Gonzo ©   (2006-10-26 18:34) [6]

3. каким образом сам дэлф получает список баз данных в этом окне?

Это происходит только при правильном вводе:
 - сервера
 - логина/пароля

т.е. без связки логина/пароля тебя к серверу вообще не допустят:) Пароль / логин это не доступ к определенным таблицам, а прежде всего идентификация пользователя сервера ! А уже потом его привелегии права и т.д.  

На мой звгляд техника такова:

1. Нужен пользователь с доступом.
2. Формироуем коннекш стринг для доступа к Server, база master.
3. Вызываем sp_databases
4. Формируем уже нормальный коннекшн к нужной базе.


 
msguns ©   (2006-10-26 23:08) [7]

type
 RSQLServerVersion = record
   VersNum: string;
   ModNum: string;
 end;

 // Дескриптор SQL-сервера
 PMSSQLServerDef = ^RMSSQLServerDef;
 RMSSQLServerDef = record
   ServerName: string;          // Имя сервера
   InstanceName: string;        // Установочный ид-р сервера
   IsClustered: boolean;        // Флаг включения в серверный кластер
   Version: RSQLServerVersion;  // Версия сервера
   Port: integer;               // Коммуникационный порт
   Path: string;                // Путь к серверу в сети
 end;
procedure SQLServ_GetServersList(SQLServerList: TList);
//  Процедура посылает по сети широковещательный запрос по порту 1434 и ждет
//  100 мс, затем буфер сокета, просматривается на наличие "ответов" от MS SQL Server
//  Кажый пакет извлекается в буфер в виде строки, парсируется и информация
//  заполняет декскриптор TMSSQLServerDef, который добавляется в список,
//  адрес которого указан вх.параметром
var
 hSocket: TSocket;
 WSAData: TWSAData;
 Buf: array[0..65535] of byte;
 i, tRes, tLenSA, tLenBufRecv: integer;
 tLenBufIOCTL: u_long;
 S: AnsiString;
 saSQLSend, saSQLRecv: sockaddr_in;
 Data: byte;
 ServDef: PMSSQLServerDef;
 ls: TStrings;

const
 fBroadcast: boolean = True;

begin
 // Очистка списка серверов
 for i := 0 to SQLServerList.Count-1 do
   Dispose(PMSSQLServerDef(SQLServerList[i]));
 SQLServerList.Clear;
 Data := $02;
 WSAStartup(MakeWord(2,2), WSAData);    // Инициализация Win DLL версии 2.2. (WS2_32.DLL)
 //Получение дескриптора сокета UDP
 hSocket := Socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
 if (hSocket = INVALID_SOCKET) then exit;
 //Установка опций сокета
 tRes := setsockopt(hSocket, SOL_SOCKET{IPPROTO_TCP}, SO_BROADCAST, @fBroadcast, sizeof(BOOL));
 if (tRes = SOCKET_ERROR) then begin closeSocket(hSocket); exit; end;
 //Установка данных служебной структуры  sockaddr_in
 saSQLSend.sin_family  := AF_INET;
 saSQLSend.sin_port := htons(1434);
 saSQLSend.sin_addr.s_addr := htonl(INADDR_BROADCAST);
 //Посылка широковещательного сообщения
 tRes := sendto(hSocket, Data, 1, 0, saSQLSend, sizeof(SOCKADDR_IN));
 if (tRes = SOCKET_ERROR) then begin closeSocket(hSocket); exit; end;
 Sleep(100);  // Ожидание ответа на пакет-запрос
 tRes := ioctlSocket(hSocket,FIONREAD,tLenBufIOCTL);  // Опрос состояния сокета
 if (tRes = SOCKET_ERROR) then begin closeSocket(hSocket); exit; end;
 if (tLenBufIOCTL>0) then // В буфере сокета (порта) есть данные
   begin
    tLenSA := sizeof(SOCKADDR_IN);
    saSQLRecv := saSQLSend;
    while tLenBufIOCTL>0 do  // Пока не просмотрен весь буфер
      begin
       // Чтение очередного пакета из буфера сокета
       tLenBufRecv := recvfrom(hSocket, Buf, 65535, 0, saSQLRecv, tLenSA);
       // Уменьшение буфера на длину считанных данных (типа удаление пакета из буфера)
       tLenBufIOCTL := tLenBufIOCTL-tLenBufRecv;
       if(tLenBufRecv=SOCKET_ERROR) then begin closeSocket(hSocket); exit; end;
       // Содержимое пакета -> строку
       s := ""; for i := 3 to tLenBufRecv-3 do s := s+Chr(Buf[i]);
       // Парсинг полученной информации и упаковка ее в структуру
       ls := TStringList.Create;
       // Строку порезать на строки (разделитель ";")
       while Length(s)>0 do
         begin
          i := Pos(";",s);
          if i>0 then
            begin ls.Add(Trim(Copy(s,1,i-1))); Delete(s,1,i); end
          else
            begin ls.Add(s); s := ""; end;
         end;
         // Разбор списка строк, где нечетная содержит ключ, а четное - его значение
         if ls.IndexOf("ServerName")>-1 then
           begin
            // Создание нового дескриптора
            ServDef := NEW(PMSSQLServerDef);
            // Имя сервера
            if ls.Count>(ls.IndexOf("ServerName")+1) then
               ServDef.ServerName := ls[ls.IndexOf("ServerName")+1];
            // Установочный идентификатор
            if (ls.IndexOf("InstanceName")>-1) and
               (ls.Count>(ls.IndexOf("InstanceName")+1)) then
               ServDef.InstanceName := ls[ls.IndexOf("InstanceName")+1];
            // Флаг принадлежности к кластеру
            if (ls.IndexOf("IsClastered")>-1) and
               (ls.Count>(ls.IndexOf("IsClastered")+1)) then
               ServDef.IsClustered := not (ls[ls.IndexOf("IsClastered")+1]="No");
            // Версия сервера
            if (ls.IndexOf("Version")>-1) and
               (ls.Count>(ls.IndexOf("Version")+1)) then
              begin
               S := ls[ls.IndexOf("Version")+1];
               // Найти первую точку
               i := Pos(".",S);
               if i>0 then
                 begin
                  ServDef.Version.VersNum := Copy(S,1,i-1);
                  ServDef.Version.ModNum := Copy(S,i+1,Length(S)-i);
                 end
               else
                 begin
                  ServDef.Version.VersNum := S;
                  ServDef.Version.ModNum := "";
                 end;
              end;
            // Адрес коммуникационного порта
            if (ls.IndexOf("tcp")>-1) and
               (ls.Count>(ls.IndexOf("tcp")+1)) then
                ServDef.Port := StrToIntDef(ls[ls.IndexOf("tcp")+1],0);
            // Сетевой путь к серверу
            if (ls.IndexOf("np")>-1) and
               (ls.Count>(ls.IndexOf("np")+1)) then
                ServDef.Path := ls[ls.IndexOf("np")+1];
            SQLServerList.Add(ServDef);
           end;
      end;
   end;
 closeSocket(hSocket);
 WSACleanup;
end;


 
MsGuns ©   (2006-10-26 23:08) [8]

function SQLServ_GetServerDBList(SQLServer: PMSSQLServerDef; ListDB: TStrings): boolean;
// Создается объект TADOConnection с "пустой" БД (Initial Catalog)
// и User ID = "sa". Затем создается объект TADOQuery, привязывается к
// соединению и выполняющий зпрос к системной таблице sysdatabases
// Полученный НД сканируется и содержимое первого поля НД (имена Баз Данных)
// заполняет список ListDB
//  Возвращаемый результат содержит false, если соединение с указанным сервером
// не может быть установлено либо запрос не был выполнен нормально
begin
 result := true;
 ListDB.Clear;
 with TADODataSet.Create(nil) do
   try
     ConnectionString := "Provider=SQLOLEDB;Persist Security Info=false"+
                        ";User ID=sa;Data Source="+SQLServer.ServerName;
     CommandText := "use master select * from sysdatabases";
     try
       Open;
       while not EOF do
         begin ListDB.Add(Fields[0].AsString); Next; end;
       Close;
     except
      result := false;
     end;
   finally
     Free;
   end;
end;

function SQLServ_GetServerTableList(SQLServer: PMSSQLServerDef; DataBase: string; ListTables: TStrings): boolean;
begin
 ListTables.Clear;
 with TADODataSet.Create(nil) do
   try
     ConnectionString := "Provider=SQLOLEDB;"+
                         ";Persist Security Info=false"+
                         ";User ID=sa"+
                         ";Data Source="+SQLServer.ServerName;
     CommandText := "use "+DataBase+" select * from sysobjects where xtype="+QuotedStr("u");
     try
       Open;
       while not eof do
         begin
          ListTables.Add(Fields[0].AsString);
          Next;
         end;
       Close;
       result := true;
     except
       result := false;
     end;
   finally
     Free;
   end;
end;


 
АлексейК   (2006-10-27 11:19) [9]

exec sp_helpdb


 
DimaBr   (2006-10-27 15:45) [10]


> а мне надо список баз на сервере

Что может быть проще, запустите пофайлер и Enterprise Menager. Делая действия в EM наблюдайте какие команды отсылаютя серверу для получения той либо иной информации. В данном случае используйте
exec sp_MSdbuseraccess N"db", N"%"


 
DiamondShark ©   (2006-10-28 19:19) [11]


> msguns ©   (26.10.06 23:08) [7]

Ты жесток.



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2007.01.14;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.013 c
2-1166529073
~Димас~
2006-12-19 14:51
2007.01.14
Интеграция


15-1166726917
Vudu
2006-12-21 21:48
2007.01.14
Кто работал с SWREG?


2-1167124313
inkvizitor
2006-12-26 12:11
2007.01.14
chart


6-1155559604
Shaman_
2006-08-14 16:46
2007.01.14
idHTTP вылетает на HTTP/1.1 500 Internal Server Error


1-1164189958
Монг
2006-11-22 13:05
2007.01.14
Проблема с окнами.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский