2012-04-12 21 views
12

Non ho idea del motivo per cui viene visualizzato questo errore e non riesco a trovare alcuna soluzione. Posso connettermi a un database di SQL Server usando freesds tsql ma continuo a ricevere un errore durante la connessione usando pymssql.connect.Impossibile connettersi al database di SQL Server utilizzando pymssql ma è possibile connettersi utilizzando freetds sottostanti tsql

L'errore specifico è:

pymssql.OperationalError: (18456, "Login failed for user 'xxx'.DB-Lib error message 18456, severity 14:\nGeneral SQL Server error: Check messages from the SQL Server\nDB-Lib error message 20002, severity 9:\nAdaptive Server connection failed\n")

ho impostato la configurazione per FreeTDS come:

[custom_config] 
    host = myhost 
    port = 1433 
    tds version = 7.0 
    encryption = request 
    dump file = /tmp/freetds.log 

corsa:

tsql -S custom_config -U tsmv -P xxx 

rendimenti:

locale is "en_US.UTF-8" 
locale charset is "UTF-8" 
using default charset "UTF-8" 
1> 

che mi consente di interrogare il database.

Tuttavia, l'esecuzione:

python 
>> import pymssql 
>> pymssql.connect(server='custom_config', user='user', password='xxx', database='database') 

genera l'errore precedente.

Sto usando Linux CentOS, python 2.6.6, freetds 0.92 dev (Ho provato altre versioni di compilazione con tdsver = 7.0).

Il registro FreeTDS è:

log.c:196:Starting log file for FreeTDS 0.92 
on 2012-04-12 10:39:15 with debug flags 0x4fff. 
iconv.c:330:tds_iconv_open(0x1391b70, ISO-8859-1) 
iconv.c:187:local name for ISO-8859-1 is ISO-8859-1 
iconv.c:187:local name for UTF-8 is UTF-8 
iconv.c:187:local name for UCS-2LE is UCS-2LE 
iconv.c:187:local name for UCS-2BE is UCS-2BE 
iconv.c:349:setting up conversions for client charset "ISO-8859-1" 
iconv.c:351:preparing iconv for "ISO-8859-1" <-> "UCS-2LE" conversion 
iconv.c:391:preparing iconv for "ISO-8859-1" <-> "UCS-2LE" conversion 
iconv.c:394:tds_iconv_open: done 
net.c:205:Connecting to xx.x.x.xxx port 1433 (TDS version 7.1) 
net.c:270:tds_open_socket: connect(2) returned "Operation now in progress" 
net.c:310:tds_open_socket() succeeded 
util.c:156:Changed query state from DEAD to IDLE 
net.c:741:Sending packet 
0000 12 01 00 34 00 00 00 00-00 00 15 00 06 01 00 1b |...4.... ........| 
0010 00 01 02 00 1c 00 0c 03-00 28 00 04 ff 08 00 01 |........ .(......| 
0020 55 00 00 02 4d 53 53 51-4c 53 65 72 76 65 72 00 |U...MSSQ LServer.| 
0030 c7 39 00 00   -      |.9..| 

net.c:555:Received header 
0000 04 01 00 25 00 00 01 00-      |...%....| 

net.c:609:Received packet 
0000 04 01 00 25 00 00 01 00-00 00 15 00 06 01 00 1b |...%.... ........| 
0010 00 01 02 00 1c 00 01 03-00 1d 00 00 ff 0a 00 0f |........ ........| 
0020 a0 00 00 02 00   -      |.....| 

login.c:1057:detected flag 2 
login.c:782:quietly sending TDS 7+ login packet 
token.c:328:tds_process_login_tokens() 
net.c:555:Received header 
0000 04 01 00 72 00 51 01 00-      |...r.Q..| 

net.c:609:Received packet 
0000 04 01 00 72 00 51 01 00-aa 5e 00 18 48 00 00 01 |...r.Q.. .^..H...| 
0010 0e 1d 00 4c 00 6f 00 67-00 69 00 6e 00 20 00 66 |...L.o.g .i.n. .f| 
0020 00 61 00 69 00 6c 00 65-00 64 00 20 00 66 00 6f |.a.i.l.e .d. .f.o| 
0030 00 72 00 20 00 75 00 73-00 65 00 72 00 20 00 27 |.r. .u.s .e.r. .'| 
0040 00 74 00 73 00 6d 00 76-00 27 00 2e 00 0c 4d 00 |.t.s.m.v .'....M.| 
0050 43 00 53 00 2d 00 44 00-41 00 54 00 41 00 42 00 |C.S.-.D. A.T.A.B.| 
0060 41 00 53 00 45 00 00 01-00 fd 02 00 00 00 00 00 |A.S.E... ........| 
0070 00 00     -      |..| 

token.c:337:looking for login token, got aa(ERROR) 
token.c:122:tds_process_default_tokens() marker is aa(ERROR) 
token.c:2588:tds_process_msg() reading message 18456 from server 
token.c:2661:tds_process_msg() calling client msg handler 
dbutil.c:85:_dblib_handle_info_message(0x14e2e30, 0x1391b70, 0x7fff8b047e40) 
dbutil.c:86:msgno 18456: "Login failed for user 'xxx'." 
token.c:2674:tds_process_msg() returning TDS_SUCCEED 
token.c:337:looking for login token, got fd(DONE) 
token.c:122:tds_process_default_tokens() marker is fd(DONE) 
token.c:2339:tds_process_end: more_results = 0 
    was_cancelled = 0 
    error = 1 
    done_count_valid = 0 
token.c:2355:tds_process_end() state set to TDS_IDLE 
token.c:2370:    rows_affected = 0 
token.c:438:tds_process_login_tokens() returning TDS_FAIL 
login.c:466:login packet accepted 
util.c:156:Changed query state from IDLE to DEAD 
util.c:331:tdserror(0x14e2e30, 0x1391b70, 20002, 0) 
dblib.c:7929:dbperror(0x1383c70, 20002, 0) 
dblib.c:7981:20002: "Adaptive Server connection failed" 
dblib.c:8002:"Adaptive Server connection failed", client returns 2 (INT_CANCEL) 
util.c:361:tdserror: client library returned TDS_INT_CANCEL(2) 
util.c:384:tdserror: returning TDS_INT_CANCEL(2) 
dblib.c:1443:dbclose(0x1383c70) 
dblib.c:258:dblib_del_connection(0x7fa462faf540, 0x1391b70) 
mem.c:615:tds_free_all_results() 
dblib.c:305:dblib_release_tds_ctx(1) 
dblib.c:5882:dbfreebuf(0x1383c70) 
dblib.c:739:dbloginfree(0x1533a40) 

io sono completamente perso sul motivo per cui questo non sta funzionando. Qualsiasi aiuto sarebbe molto apprezzato.

+0

È possibile che si stia utilizzando il nomeserver anziché il server. Inoltre, mi sono imbattuto in problemi (almeno con pyodbc) in cui una stringa di connessione non sembra comportarsi esattamente come passare kwargs (potrebbe essere il mio errore però ...). Puoi anche provare a utilizzare pyodbc invece di pymssql (nessuna esperienza con pymssql qui). –

+0

Grazie a Derek, ho seguito il tuo consiglio, evitato l'uso di pymssql e ho iniziato a usare pyodbc con il driver Linux di Microsoft. Tutto funziona bene ora (anche se so che questo non risponde alla mia domanda iniziale). – chewynougat

risposta

6

La "connessione server adattiva non riuscita" sembra essere un messaggio abbastanza generico, ma qui ci sono alcune cose da provare.

  1. Questo thread mailing list (http://lists.ibiblio.org/pipermail/freetds/2010q3/026060.html) dice che utilizzando i risultati di protocollo TDS non corretti in un messaggio di "connessione di Adaptive Server non riuscita". Questo non sembra essere il caso nel registro di Chewynougat, ma forse aiuta gli altri.

  2. Questa FAQ dà un sacco di passi per provare: https://github.com/pymssql/pymssql/blob/87f4383ec153962b7ca7e63a05042d3f09005178/docs/faq.rst,

One sta tentando di verificare la connessione tds via tsql -H, che bypassa la lettura dal conf e legge solo nel passato in valori. Dato che il conf sopra contiene sia la versione port che quella del protocollo, potrebbe essere utile verificare insieme a tsql -C se sono necessari degli aggiustamenti.

  1. Inoltre, in fondo le FAQ, essa afferma che

    real "Login incorrect" messages has code=18456 and severity=14

That is the error message being sent, so perhaps try Login Auditing ( http://msdn.microsoft.com/en-us/library/ms175850.aspx) to see if pymssql is passing your credentials in properly.

  1. Quella stessa sezione parla di diversi set di caratteri incasinando mssql.connect, quindi forse anche provare una password di base (ad esempio, ASCII 65-90) per garantire che nulla vada perso nella traduzione. Sembra che Aki lavori con i giapponesi, quindi forse anche questa è una causa.
2

Ho affrontato lo stesso problema.Fortunatamente, ho scoperto cosa c'è che non va. Ho avuto due diverse versioni di FreeTDS sulla mia macchina. Ho installato uno di loro (v 0.91) da:

sudo apt-get install freetds-dev 

Più tardi ho scoperto che non è l'ultima versione e ho scaricato il file tar di FreeTDS da freetds.org. Quando ho eseguito tsql -C. ha mostrato il percorso corretto e ho manipolato correttamente freetds.conf. Con la modifica della variabile di ambiente (http://www.freetds.org/userguide/envvar.htm), potrei connettermi al database. Tuttavia, ogni volta che ho provato a connettermi con Pymssql ho avuto un errore.

Infine, ho guardato il file di registro e ho capito che Python sta usando la vecchia versione (v 0.91) ma il mio ultimo era la versione 0.95.

>>> import os 
>>> os.environ['TDSDUMP'] = 'stdout' 
>>> 
>>> import pymssql 
>>> conn = pymssql.connect(server="sqlserverhost") 

Così, ho cancellato la versione 0.91 con:

sudo apt-get purge freetds-common 

e pymssql collegata alla versione destra con la configurazione corretta.

Può essere d'aiuto.

Problemi correlati