web-dev-qa-db-fra.com

Comment connecter un =ODBC DSN à Nondefault SQL Server Server sur le port par défaut?

Nous migrons une base de données SQL Server 2000 sur un serveur sur SQL Server 2008 R2 sur un autre serveur. L'application client utilise un utilisateur DSN pour se connecter directement au serveur SQL sur Internet.

J'ai sauvegardé la base de données sur l'ancien serveur et restauré sur le nouveau serveur et je suis capable de vous connecter à l'aide de SQL Management Studio, d'exécuter des requêtes, etc.

Le serveur SQL dans le nouveau serveur n'est pas l'instance par défaut, mais j'ai utilisé SQL Configuration Manager pour modifier le port par défaut de cette instance à 1433. SQL Management Studio peut se connecter à l'instance correcte en spécifiant simplement l'adresse IP du serveur ou le nom de domaine (donc pas de problèmes de pare-feu, ni donc je penserais).

Jusqu'ici tout va bien.

Le problème vient lorsque j'essaie de vous connecter au serveur avec mon application client. Je reçois une erreur de connexion/erreur d'instance non valide. L'application cliente exécutée dans environ 100 ordinateurs dans 50 endroits différents, la reconfiguration de chacune peut-elle être effectuée dans une journée, ce qui entraîne des temps d'arrêt.

J'ai essayé de créer un DSN sur mon ordinateur pour tester la connexion. Si je spécifie l'adresse IP avec un numéro de port (123.123.123.123,1433), cela fonctionne, mais si je n'utilise que l'adresse IP (123.123.123.123), je reçois la même erreur que ci-dessus.


La connexion a échoué:
[.____] SQLSTATE: '01000'
Erreur SQL Server: 14
[.____] [Microsoft] [pilote ODBC SQL Server] [Sockets TCP/IP] ConnecteOpen (Instance non valide ()).
La connexion a échoué:
[.____] SQLSTATE: '08001'
Erreur SQL Server: 14
[.____] [Microsoft] [pilote ODBC SQL Server] [Sockets TCP/IP] Connexion invalide.


La seule différence que je peux penser entre le nouveau serveur et l'ancien, à part la version SQL Server, est que, dans l'ancien, l'instance par défaut, tandis que dans le nouveau, il s'agit d'une instance nommée.

Avez-vous des idées de ce que je pourrais essayer ensuite?

ÉDITER:

Quelques autres choses que j'ai essayées:

  • J'utilise le serveur SQL ODBC pilote. Si j'utilise le pilote client natif de SQL Server, tout fonctionne comme je m'attends.
  • Si je crée la connexion DSN dans le même serveur, à l'aide de l'adresse IP publique du serveur, le même comportement est observé.
  • Si j'arrête l'instance Nondefault et exécutez l'instance par défaut sur le port 1433, cela fonctionne comme prévu (sans spécifier le port). Si je définissais l'instance Nondefault pour écouter le port 1433, je dois spécifier explicitement le port à connecter.

Fin d'édition

Merci!

Luis Alonso Ramos

3

Il semble que ce que vous voulez réaliser n'est pas possible en utilisant ce client.

Le problème est le résultat d'anciens clients SQL (spécifiquement à l'aide du pilote MDAC SQLSVR32.dll) effectuer une vérification "instanceValidité" lors de la connexion à SQL Server. Le pilote passe "MSSQLSERVER" comme exemple pour vérifier la vérification de l'instanceValidité. Dans ce cas, étant donné que le nom d'instance à l'écoute du port par défaut (1433) est nommé "instance01" et "instance02", il échoue car les noms d'instance ne correspondent pas à la vérification de l'instanceValidité.

Selon ce qui est le plus convaincant pour vous dans ce cas, vous devrez peut-être spécifier le port de votre client, modifier votre client ou modifier votre instance nommée pour être votre instance par défaut.

Source: http://social.msdn.microsoft.com/forums/sqlserver/en-us/7f353b59-8E7F-4EC3-ADCB-E69CA2629B21/NAMED-SQL-2008-R2-Server-listening-on- Par défaut-Port-1433-avec-dédié-adresse-ip-address-exige-port? forum = sqldataaccess

1
Ed. Urrutia

Vérifiez d'abord que votre instance de SQL Server dispose du protocole TCP/IP activé. Examinez ensuite quel port TCP/IP Votre instance de SQL Server est "à l'écoute".

Ensuite, s'il y a un pare-feu sur cette machine, vérifiez s'il existe une exception dans les règles (entrante) pour le programme SQL Server Management Studio STUDIO, le cas échéant, il serait possible de passer par le pare-feu, mais ODBC _ ne serait pas.

À propos de la référence du serveur, vous pouvez essayer de référencer votre serveur comme "ServerName\InstanceName" ou à l'aide du numéro de port, essayez "ServerName, 1433" ou "ServerName\InstanceName, 1433" comme adresse de serveur.

Votre serveur doit également savoir quel port pour répondre, lorsque le port TCP est vide n'est pas méchant pour utiliser le port par défaut. Selon ce que vous voulez réaliser, vous devrez peut-être faire ou vérifier si une de ces choses est terminée correctement:

Comment l'allocation de port est définie sur votre serveur https://dba.stackexchange.com/questions/47651/when-is-a-dynamic-por-dynamique

Configurez un serveur pour écouter sur un port TCP (SQL Server Configuration Manager) http://msdn.microsoft.com/en-us/library/ms177440.aspx

Attribuez un port statique à une instance nommée SQL Server - et évitez un piège commun http://blogs.msdn.com/b/arvindsh/archive/2012/09/08/how-to -Assign-A-static-port-Port-to-SQL-Server-Named-instance-instance-et-Évite-a-courant-palball.aspx

Pour vous connecter à des serveurs SQL distants, vous avez deux options, vous devez utiliser IP et Port (ce qui est plus sûr) ou explicite spécifier l'instance nommée et l'ouverture du port UDP 1434 et activant le navigateur SQL Server.

La raison est que: seuls les instances nommées de SQL Server peuvent utiliser le processus d'allocation de ports dynamique. Dans le processus d'allocation de ports dynamique, lorsque vous démarrez l'instance de SQL Server pour la première fois, le port est réglé sur zéro (0). Par conséquent, SQL Server demande un numéro de port libre à partir du système d'exploitation. Dès qu'un numéro de port est attribué à SQL Server, SQL Server commence à écouter sur le port alloué.

Lorsqu'une instance de SQL Server utilise une allocation de port dynamique, la chaîne de connexion construite sur le client SQL Server ne spécifie pas le port TCP/IP de destination, à moins que l'utilisateur ou le programmeur spécifie explicitement le port. Par conséquent, la bibliothèque client SQL Server interroge le serveur sur le port UDP 1434 pour collecter les informations sur l'instance de destination de SQL Server. Lorsque SQL Server renvoie les informations, la bibliothèque client SQL Server envoie les données à l'instance appropriée de SQL Server.

Si UDP Port 1434 est désactivé, le client SQL Server ne peut pas déterminer de manière dynamique le port de l'instance nommée de SQL Server. Par conséquent, le client SQL Server ne peut pas être incapable de se connecter à l'instance nommée de SQL Server. Dans cette situation, le client SQL Server doit spécifier le port attribué dynamiquement l'instance nommée de SQL Server 2008.

De plus, en fonction de ce que vous voulez, vous pouvez utiliser un système ODBC, plutôt que d'un utilisateur ODBC. La différence est que l'utilisateur ODBC est lié à un compte d'utilisateur sur la machine.

1
Random Citizen

J'ai exactement le même problème et j'ai réussi à le résoudre! C'est ce que j'ai appris.

  • Si vous avez installé une instance nommée. Vous ne pouvez pas modifier le nom en défaut. Vous pouvez cependant: rendre l'instance nommée écouter le port par défaut. Qui aident à se connecter à Gestion Studio sans spécifier un nom d'instance mais n'aident pas pour ODBC.

  • Vous pouvez créer des alias (avec nom comme MSSQLServer ou l'adresse IP, comme une astuce) pour que vos clients fonctionnent. Pourrait fonctionner pour certaines applications.

  • Si cette solution de contournement n'aide pas que votre meilleur pari est de désinstaller SQL complètement et de réinstaller à nouveau, mais il est probable que la nouvelle installation peut revenir au nom de l'instance nommée, même si vous avez sélectionné "instance par défaut". Vous pouvez vérifier cela dans les services SQL pour voir s'il s'agit toujours de l'ancien nom. Dans ce cas, le meilleur moyen (qui a fonctionné pour moi) est d'installer une nouvelle instance avec le nom explicite de MSQLServer, qui est connu pour être le nom d'instance par défaut. C'est ce qui va le faire fonctionner avec ODBC.

Sur une note séparée: SQL prend le nom de l'ordinateur et l'utilise comme alias.

0
Moe Eqbal