【问题标题】:freetds and pyodbc failing to connectfreetds 和 pyodbc 无法连接
【发布时间】:2014-12-31 21:45:37
【问题描述】:

我目前正在建立从 Linux 机器到 Microsoft SQL 服务器的连接。我已经在 Linux 机器上安装了 FreeTDS 和 pyodbc。

我已经设置了以下文件: /etc/freetds/freetds.conf

[sqlserver]
    host = <ip address>
    port = 1433
    tds version = 8.0
    client charset = UTF-8

~/.odbc.ini

[sqlserver]
Description     = FreeTDS MSSQL
Driver          = FreeTDS
Servername      = <same ip as above> 
Database        = Reports
TDS_Version     = 8.0

/etc/odbcinst.ini

[FreeTDS]
Description             = FreeTDS MSSQL
Driver                  = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
Driver64                = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
Setup                   = /usr/lib/x86_64-linux-gnu/odbc/libtdsS.so
Setup64                 = /usr/lib/x86_64-linux-gnu/odbc/libtdsS.so
UsageCount              = 1
CPTimeout               = 
CPTimeToLive            = 
DisableGetFunctions     = 
DontDLCLose             = 
ExFetchMapping          = 
Threading               = 
FakeUnicode             = 
IconvEncoding           = 
Trace                   = 
TraceFile               = 
TraceLibrary            = 

当我尝试运行 tsql -S sqlserver -U 用户名 -P 密码时,我收到以下错误:

locale is "en_US.UTF-8"
locale charset is "UTF-8"
using default charset "UTF-8"
Msg 18452 (severity 14, state 1) from SYMPLECTIC03 Line 1:
    "Login failed. The login is from an untrusted domain and cannot be used with Windows authentication."
Error 20002 (severity 9):
    Adaptive Server connection failed
There was a problem connecting to the server

我还尝试在以下脚本中连接 pyodbc:

import pyodbc
try:
    cnxn = pyodbc.connect('DRIVER=FreeTDS;SERVER=same_ip_as_above;DATABASE=Reports;UID=myusername;PWD=mypassword')
except pyodbc.Error, err:
    print err

打印以下错误:

('001', '[001] [nxDC[reD]SLSre]nbet onc odt ore (0) (SQLDriverConnect)')

不完全是最有用的错误消息。

尝试连接时我做错了什么吗?

附带说明,我们的数据库需要 Windows 身份验证,而不是集成。 我可以 telnet 连接到主机,所以这也不是问题。

【问题讨论】:

    标签: sql-server linux pyodbc freetds


    【解决方案1】:

    使用 Windows 身份验证可能会很棘手……而且非常难看。最佳做法:

    • 在 SQL Server 中创建一个 SQL Authenticated 用户,以尽可能有限的权限进行连接。

    • 附带说明,TDS 版本 8.0 可以使用,但为了正确起见,您应该使用 TDS 版本 7.2:https://www.freetds.org/userguide/ChoosingTdsProtocol.html

    • TDS 版本在 2012 年和 2014 年发生了变化,但向后兼容。我在 2012 年或 2014 年使用 Django 的 pyodbc 没有任何问题。

    • 您还需要更改此行以包含 TDS 版本:

      cnxn = pyodbc.connect('DRIVER=FreeTDS;SERVER=same_ip_as_above;DATABASE=Reports;UID=myusername;PWD=mypassword;TDS_Version=7.2;')

    祝你好运;我相信如果你解决了这个问题,堆栈的其余部分应该会正常运行。

    问候,

    -蒂姆

    【讨论】:

      【解决方案2】:

      设置看起来不错。我有一个类似的东西在工作,在服务器升级到NTLMv2 后它就坏了。这在测试tsql 时出现“...untrusted domain...”错误。 * detail here

      我只需要在我的freetds.conf 规范中包含use ntlmv2 = yes

      【讨论】:

        猜你喜欢
        • 2017-04-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-28
        • 2013-05-31
        • 2016-07-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多