2012-04-12 17 views
12

No tengo idea de por qué estoy recibiendo este error y no puedo encontrar ninguna solución para él. Puedo conectarme a una base de datos de SQL Server usando freetds tsql pero sigo recibiendo un error al conectarme usando pymssql.connect.No puedo conectarme a la base de datos de SQL Server usando pymssql pero puedo conectarme usando los controles subyacentes tsql

El error específico es:

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")

He establecer la configuración para freetds como:

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

funcionamiento:

tsql -S custom_config -U tsmv -P xxx 

devuelve:

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

que me permite consultar la base de datos.

Sin embargo, en ejecución:

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

plantea el error anterior.

Estoy usando Linux CentOS, python 2.6.6, freetds 0.92 dev (he probado otras versiones compilando con tdsver = 7.0).

El registro es 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) 

estoy completamente perdido en cuanto a por qué esto no está funcionando. Cualquier ayuda sería muy apreciada.

+0

Es posible que desee utilizar nombre de servidor en lugar de servidor. Además, me encontré con problemas (al menos con pyodbc) donde una cadena de conexión no parecía comportarse exactamente igual que pasar kwargs (aunque puede ser mi error ...). También podría intentar usar pyodbc en lugar de pymssql (no hay experiencia con pymssql aquí). –

+0

Gracias Derek, he seguido tu consejo, he rechazado el uso de pymssql y he comenzado a usar pyodbc con el controlador de Linux de Microsoft. Todo funciona bien ahora (aunque sé que esto no responde mi pregunta original). – chewynougat

Respuesta

6

La "conexión de Adaptive Server failed" parece ser un mensaje bastante genérico, pero aquí hay algunas cosas que debe probar.

  1. Este hilo lista de correo (http://lists.ibiblio.org/pipermail/freetds/2010q3/026060.html) dice que el uso de los resultados del protocolo TDS incorrectas en una "conexión Adaptive Server" mensaje. Ese no parece ser el caso en el registro de chewynougat, pero quizás ayuda a otros.

  2. Este FAQ da una gran cantidad de medidas para tratar: https://github.com/pymssql/pymssql/blob/87f4383ec153962b7ca7e63a05042d3f09005178/docs/faq.rst,

Uno está tratando de probar la conexión a través de TDS -H tsql, que no pasa por la lectura de la conf y sólo lee en el pasado en valores Dado que la configuración anterior contiene tanto el puerto como la versión de protocolo, podría valer la pena verificarlo junto con tsql -C para ver si se necesitan ajustes.

  1. Además, en la parte inferior de la FAQ, que establece que

    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. esa misma sección, habla de diferentes juegos de caracteres estropeando el mssql.connect, así que quizás también intente con una contraseña básica (es decir, ASCII 65-90) para asegurarse de que no se pierda nada en la traducción. Parece que Aki trabaja con japonés, por lo que quizás esta sea también una causa.
2

Tuve el mismo problema.Afortunadamente, descubrí lo que está mal. Tenía dos versiones diferentes de FreeTDS en mi máquina. He instalado uno de ellos (v 0.91) por:

sudo apt-get install freetds-dev 

más tarde me di cuenta que no es la última versión y he descargado el archivo tar de FreeTDS de freetds.org. Cuando ejecuté tsql -C. mostraba el camino correcto y manipulé ese freetds.conf correctamente. Con la variable de entorno cambiante (http://www.freetds.org/userguide/envvar.htm), podría conectarme a la base de datos. Sin embargo, cada vez que intenté conectarme con Pymssql recibí el error.

Finalmente, miré el archivo de registro y me di cuenta de que Python está usando la versión anterior (v 0.91) pero la última era la versión 0.95.

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

Por lo tanto, he eliminado la versión 0.91 con:

sudo apt-get purge freetds-common 

y pymssql conectado a la versión correcta con la configuración correcta.

Puede serle de ayuda también.

Cuestiones relacionadas