APSQL

Pourquoi est-il si difficile d'obtenir la liste de tous les instances SQL Server ?

Que ce soit depuis SSMS où seulement quelques instances apparaissent dans les combos-box ou bien sont découvertes automatiquement. Le résultat n'est guère meilleur depuis SQLCMD et la commande LIST(cf établir la liste des serveurs).

Pour comprendre pourquoi la découverte des instances SQL Server est si difficile il est nécessaire de se pencher d'un peu plus près sur le fonctionnement réseau et plus exactement sur le fonctionnement du protocole UDP car c'est bien lui qui est utilisé dans le cadre de cette découverte.

Reposons tout d'abord quelques grands principes sur le fonctionnement d'UDP qui n'est en fait que l'un des protocoles TCP/IP. C'est en effet ce protocole UDP qui est utilisé pour découvrir les instances. SQL Server utilise également UDP pour découvrir comment se connecté à une instance nommée.

Dans les 2 cas la demande de connection est adressé via UDP sur le port 1434. Mais dans le cas de la découverte l'outils client effectue un broadcats, tandis que lors de l'établissement d'une connexion la demande est adressé avec une adresse IP de destination précise.

Lorsque le client (sqlcmd par exemple) adresse une demande de type broadcast sur le port 1434 il utilise l'adresse de destination 255.255.255.255. après cet envoie, le client attend donc les réponses des instances SQL Server. Sans réponse, il n'est pas possible de découvrir le serveur.

Plusieurs raisons peuvent expliquer la non découverte :

  • La communication UDP est rompue : comme le protocole n'a pas possibilité de détecter cette perte, il n'est pas possible de renouveller cette demande spécifique
  • Le port 1434 est bloqué sur le réseau, par un pare-feu sur le serveur ou bien le client. Les communications sur le port 1434 sont interdites par une directive IPSEC : ces différentes politiques de sécurité on pu être mises en place particulièrement pour faire face à un vers ( SQL Slammer )
  • L'instance SQL n'est pas configuré pour utiliser des bibliothèques réseau autre que Mémoire partagée ou bien les connections distantes ne sont pas autorisées :La découverte passe par le protocole TCP/IP.
  • Pour une instance SQL Server 2000 la propriété Hide Server est activée : Il est donc normal de ne pas voir cette instance.
  • Pour les instances SQL 2005/2008 le service SQL Server Browser n'est pas démarré : C'est en effet ce service qui répond pour les instances nommées.

Pour remedier à ce problème il est nécessaire d'avoir recours à des outils tiers. Il est possible de citer par exemple SQL Ping ( http://www.sqlsecurity.com/Tools/FreeTools/tabid/65/Default.aspx)