web-dev-qa-db-fra.com

freeTDS n'utilise pas sa configuration

J'ai décidé d'utiliser le pilote FreeTDS et unixODBC pour gérer la connexion PDO entre mon application basée sur LAMP avec une base de données MsSQL distante. malheureusement, il semble que le pilote ne lit pas le fichier freetds.conf, ni les variables d'environnement définies directement via la CLI du serveur ou spécifiées dans le fichier php par la fonction putenv ().

maintenant quelques données:

  1. pendant que je ping le serveur - aucun paquet n'est perdu.
  2. comme je telnet le serveur sur le port 1433 - la connexion est établie
  3. comme j'utilise la commande

    TDSVER=7.0 tsql -H >IP< -p 1433 -U username
    

    Je suis invité à saisir le mot de passe et la connexion est établie.

  4. sans le TDSVER précédant la commande - la connexion échoue avec un tel message:

    Error 20017 (severity 9):
        Unexpected EOF from the server
        OS error 115, "Operation now in progress"
    Error 20002 (severity 9):
        Adaptive Server connection failed
    There was a problem connecting to the server
    
  5. le tsql -C commande échos une telle sortie:

    Compile-time settings (established with the "configure" script)
                           Version: freetds v0.91
            freetds.conf directory: /usr/local/etc
    MS db-lib source compatibility: yes
       Sybase binary compatibility: no
                     Thread safety: yes
                     iconv library: yes
                       TDS version: 5.0
                             iODBC: no
                          unixodbc: yes
             SSPI "trusted" logins: no
                          Kerberos: no
    
  6. freetds.conf à l'emplacement indiqué ci-dessus a cette entrée:

    [MSSQL]
    Host = >IP<
    port = 1433
    tds version = 7.0
    
  7. l'ISQL échoue également:

    isql -v MSSQL
    [S1000][unixODBC][FreeTDS][SQL Server]Unable to connect to data source
    [01000][unixODBC][FreeTDS][SQL Server]Adaptive Server connection failed
    [ISQL]ERROR: Could not SQLConnect
    
  8. mon odbc.ini:

    [MSSQL]
    Description = MS SQL Server
    Driver = FreeTDS
    TDS_Version = 7.0
    Server = >IP<
    UID = username
    PWD = password
    ReadOnly = No
    Port = 1433
    

Je suppose que la solution est vraiment simple, mais je suis juste trop stupide pour la trouver ...

17
khartvin

J'ai passé beaucoup de temps aujourd'hui à déboguer un problème similaire. J'avais défini "version TDS" dans freetds.conf mais il n'était pas utilisé dans ma connexion ODBC. Après avoir lu le code source freetds (connectparams.c: odbc_parse_connect_string), j'ai découvert que:

  • Si votre chaîne de connexion utilise "SERVER =", alors freetds.conf et odbc.ini sont ignorés
  • Si votre chaîne de connexion utilise "SERVERNAME =", les paramètres du serveur freetds.conf approprié sont utilisés
  • Si votre chaîne de connexion utilise "DSN =", les paramètres du DSN odbc.ini approprié sont utilisés.

odbcinst.ini est un hareng rouge. FreeTDS ne vérifie jamais cela pour les paramètres.

Les paramètres que vous spécifiez dans la chaîne de connexion sont toujours respectés. Il respecte également toujours les variables d'environnement comme TDSVER.

24
Max Bolingbroke

Mon instinct est que vous devez changer votre version tds = 7.0 à version tds = 8.0 dans vos fichiers freetds.conf et odbc.ini ET vous avez besoin de quelque chose dans votre fichier odbcinst.ini. Voici ce que je travaille sur un serveur Ubuntu 12.04 parlant à un serveur MSSQL distant:

freetds.conf

# Define a connection to the MSSQL server.
[mssql]
    Host = myserver
    port = 1433
    tds version = 8.0

odbc.ini

# Define a connection to the MSSQL server.
# The Description can be whatever we want it to be.
# The Driver value must match what we have defined in /etc/odbcinst.ini
# The Database name must be the name of the database this connection will connect to.
# The ServerName is the name we defined in /etc/freetds/freetds.conf
# The TDS_Version should match what we defined in /etc/freetds/freetds.conf
[mssql]
Description             = MSSQL Server
Driver                  = freetds
Database                = MyDB
ServerName              = myserver
TDS_Version             = 8.0

odbcinst.ini

# Define where to find the driver for the Free TDS connections.
[freetds]
Description     = MS SQL database access with Free TDS
Driver          = /usr/lib/i386-linux-gnu/odbc/libtdsodbc.so
Setup           = /usr/lib/i386-linux-gnu/odbc/libtdsS.so
UsageCount      = 1
10
Benny Hill

J'ai rencontré exactement le même problème, mais ma configuration était déjà correctement configurée. Le problème était que les versions TDS reconnues par freetds.conf ont changé dans les versions plus récentes, mais apparemment les anciennes versions fonctionnent toujours dans la variable d'environnement TDSVER. Une fois que j'ai défini la version dans les fichiers de configuration sur 7.1 plutôt que sur 8.0, tout a commencé à fonctionner.

4
jmsq

La première TDSVER=7.0 le problème a été résolu en ajoutant ce qui suit à la fin de mon odbc.ini fichier:

[Default]
Driver=/usr/local/lib/libtdsodbc.so
1
SCDomingos

Au lieu de vous connecter à une adresse IP, essayez de vous connecter au nom de la section de configuration? Par exemple:

isql -v MSSQL
0
Andomar