Newsgroup: it.comp.lang.visual-basic
Titolo: Elencare le istanze di SQL Server

Ciao a tutti,
ho guardato un po' in giro ma non ho trovato nulla di utile.
Il mio problema è questo:
ho la necessità di elencare tutte le istanze di sql server presenti in rete, 
fin qui nulla di speciale ... se c'è il nome dell'istanza predefinita,
ma se io ho un'istanza
SERVER\INSTANCENAME
riesco solo a farmi restituire
SERVER
non sono quindi riuscito a trovare un modo per elencare, per ogni server, 
tutte le istanze.
Spero di essermi spiegato.
Per completezza di esposizione, io uso questo codice:
**********************
    Dim i As Integer
    Dim oNames As SQLDMO.NameList
    Dim oSQLApp As SQLDMO.Application
    Set oSQLApp = New SQLDMO.Application
    Set oNames = oSQLApp.ListAvailableSQLServers()
    For i = 1 To oNames.Count
        Debug.Print oNames.Item(i)
    Next i
**********************
Qualcuno saprebbe darmi una dritta?
Uno spunto?
Grazie 1000 a tutti.
Ciao
Stefano 

salve Stefano,

il codice e' corretto, e "potrebbe" restituire tutte le istanze disponibili, 
comprese le named instances..
ListAvailableServer utilizza la funzione ODBC SQLBrowseConnect(), provvista 
dalle librerie ODBC dell'installazione di Mdac;
e' un meccanismo che funziona in BroadCast, ed il risultato non e' mai 
conclusivo, nel senso che il risultato e' sempre influenzato dalle risposte 
dei vari Server sulla rete, dai loro tempi di risposta, etc.
fino a Mdac 2.5 il meccanismo di broadcast avveniva sul protocollo NetBios 
(default per le installazioni di SQL Server 7.0), ed e' stato cambiato sul 
protocollo TCP/IP UDP, (default per le installazioni di SqlServer 2000), in 
ascolto sulla porta 1434: se i server non ascoltano sulla porta o non 
risponono in tempo, non verranno inlistati.
Alcune regole base riguardo SQL Server 7.0:
- SQL Server deve esssere attivo ed in ascolto su Named Pipes (Win9x non e' 
provvisto di Named Pipes, percui SQL Server su Win9x non e' mai in ascolto 
su questo protocollo e non potra' mai essere inlistato);
- SQL Server deve essere chiaramente in funzione per rispondere alle 
chiamate di BroadCast; esiste una finestra grigia di circa 15 minuti dopo lo 
ShutDown del server che, alla richiesta di Browse Master nel dominio puo' 
rispondere comunque positivamente alle richieste;
- La presenza di un router sulla rete interrompe le chiamate NetBIOS 
broadcast, cio' chiaramente limita la visibilita' delle chiamate Broadcast;
- Solamente i server appartenenti al dominio saranno enumerati.
Con SQL Server 2000, usando Mdac 2.6 e superiori, le cose cambiano un poco, 
in quanto il protocollo di default e' stato cambiato nei sockets TCP/IP e, 
al posto di una chiamata broadcast NetBios, viene utilizzato TCP UDP per 
rilevare i server.
La logica di relevazione precedente resta influenzata:
- SQL Server deve esssere attivo ed in ascolto;
- SQL Server deve esssere attivo ed in ascolto sui sockets TCP/IP;
- SQL Server deve esssere attivo ed in ascolto su computer 
WinNT/Win2000/WinXP o Win9x;
- La presenza di un router sulla rete interrompe le broadcast se 
quest'ultimo e' configurato in modo da non passare le chiamate UDP 
broadcast, diversamente solo i server installati sullo stesso subnet 
verranno inlistati;
E' necessario l'upgrade almeno al Service Pack 2 di SQL Server 2000 perche' 
il metodo .ListAvailableServer funzioni correttamente, in quanto le versioni 
precedenti dei Componenti Sql-DMO di SQL Server 2000 sono bacate in questa 
area.
Cortesemente da Gert E.R. Drapers
maggiori informazioni su
http://sqldev.net/misc.htm
Il service pack 3a ha introdotto alcune novita' per prevenire futuri 
problemi derivanti da worms simili a Slammer e virus tipo Safhire di 
origine, proliferazione e contagio via Internt che hanno indotto Microsoft a 
disabilitare di default i  protocolli di rete SuperSockets Network Protocols 
per nuove installazioni di MSDE 2000. Istanze di SQL Server 2000 sp3a e/o 
MSDE 2000 sp3a non saranno in ascolto sulla porta UDP 1434 quando 
configurate di non 'ascoltare' alcun protocollo di rete, termimando di 
inlistare tali istanze.
l'unica cosa che puoi verificare e' che l'istanza abbia correttamente i 
protocolli di rete abilitati, ma non potrai mai essere sicuro che la lista 
ritornata sia "completa"...
personalmente ho visto che se talvolta .ListAvailableServer non inlista 
istanze nominate, .ListInstalledInstances(NomeServer) riesce a recuperare 
anche quelle "nascoste" vista probabilmente una diversa calibrazione di 
ricerca forse implementata...
presso 
http://sqldev.net/misc.htm
 trovi almeno altre 3 metodologie di 
recupero delle istanze, basate su NetServerEnum esposto dalle api 
LanManager, OleDbEnum esposto dal provider OLE DB e SQLBrowseConnect esposto 
dalle api ODBC...
saluti
-- 
Andrea Montanari (Microsoft MVP - SQL Server)
http://www.asql.biz
 
http://italy.mvps.org
DbaMgr2k ver 0.19.0 - DbaMgr ver 0.63.0 and further SQL Tools
--------- remove DMO to reply 


Ciao Andrea,
in primis grazie per avermi risposto,
in seconda battuta approfitto di questo post per farti i complimenti per 
l'ottimo DBA Manager.
Sto leggendo con attenzione il post e i link segnalati che mi saranno 
utilissimi.
Grazie 1000 e ancora complimenti.
Ciao
Stefano 


grazie a te per il tuo interessamento...
