【问题标题】:Connect to MS SQL Server Database Using isql on Ubuntu在 Ubuntu 上使用 isql 连接到 MS SQL Server 数据库
【发布时间】:2020-01-03 05:36:33
【问题描述】:

最终目标:使用 pyodbc 将我的 Xubuntu 16.04 机器连接到远程 MS SQL Server 2017 数据库。

中间目标:让isql工作; tsql 有效,但 isql 无效。

我尝试在我的 Mac 上镜像设置 - 请参阅 this question 了解有效的方法。不幸的是,没有快乐。我查看了许多 SO 问题,例如: OneTwoThree, 并尝试了他们的方法,但都没有奏效。我确信 Linux 机器打开了正确的端口,因为 tsql 在我的 Xubuntu 16.04 机器上工作。不幸的是,我无法让isql 工作。我害怕了

[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

错误。同样不幸的是,我看到的许多文档似乎都非常过时且自相矛盾。例如:

  1. odbc.ini 文件中,应该是Server = stuff, 1433Server = stuffServerName = stuff 并带有单独的port = 行,还是应该使用instance?有太多的选择,没有足够的文档来解决这个问题。
  2. odbcinst.ini 文件中究竟应该包含什么内容?我在/usr/lib/x86_64-linux-gnu/odbc 目录中没有libtdsS.so 文件。我应该省略设置行吗?
  3. freetds.conf 文件中究竟应该包含什么内容?我应该使用实际的 IP 地址吗?
  4. 如果我想强制 FreeTDS 使用特定的协议版本,我该怎么做?更改freetds.conf 似乎不会影响tsql -C 的结果。还是我只需要退出并重新登录?
  5. 退后一步:有没有更好的方法来处理整个该死的事情?我对 pymssql 不感兴趣,因为此时它似乎是废弃软件,支持 pyodbc
  6. 我注意到tsql -LH stuff 命令不会产生任何输出。该命令是否已弃用?或者我怎样才能从任何命令中获得正确的设置?
  7. 是否有最新的、清晰的文档随处可用?或者随时随地提供最新、清晰的安装和使用指南,以及针对更常见问题的故障排除步骤?

非常感谢您的宝贵时间!

[编辑] 以下是启用后跟踪日志的内容:

[ODBC][34479][1567549751.158470][__handles.c][460]
        Exit:[SQL_SUCCESS]
            Environment = 0x1913750
[ODBC][34479][1567549751.158517][SQLAllocHandle.c][377]
        Entry:
            Handle Type = 2
            Input Handle = 0x1913750
[ODBC][34479][1567549751.158532][SQLAllocHandle.c][493]
        Exit:[SQL_SUCCESS]
            Output Handle = 0x1914060
[ODBC][34479][1567549751.158551][SQLConnect.c][3721]
        Entry:
            Connection = 0x1914060
            Server Name = [ROEFDN806Q][length = 10 (SQL_NTS)]
            User Name = [mfad\m210028][length = 12 (SQL_NTS)]
            Authentication = [********][length = 8 (SQL_NTS)]
[ODBC][34479][1567549751.158987][SQLConnect.c][3929]Error: IM002
[ODBC][34479][1567549751.159017][SQLError.c][424]
        Entry:
            Connection = 0x1914060
            SQLState = 0x7ffd099daf10
            Native = 0x7ffd099daf0c
            Message Text = 0x7ffd099daf20
            Buffer Length = 500
            Text Len Ptr = 0x7ffd099daf0a
[ODBC][34479][1567549751.159034][SQLError.c][474]
        Exit:[SQL_SUCCESS]
            SQLState = IM002
            Native = 0x7ffd099daf0c -> 0
            Message Text = [[unixODBC][Driver Manager]Data source name not found and no default driver specified]
[ODBC][34479][1567549751.159066][SQLError.c][424]
        Entry:
            Connection = 0x1914060
            SQLState = 0x7ffd099daf10
            Native = 0x7ffd099daf0c
            Message Text = 0x7ffd099daf20
            Buffer Length = 500
            Text Len Ptr = 0x7ffd099daf0a
[ODBC][34479][1567549751.159079][SQLError.c][474]
        Exit:[SQL_NO_DATA]
[ODBC][34479][1567549751.159089][SQLError.c][424]
        Entry:
            Environment = 0x1913750
            SQLState = 0x7ffd099daf10
            Native = 0x7ffd099daf0c
            Message Text = 0x7ffd099daf20
            Buffer Length = 500
            Text Len Ptr = 0x7ffd099daf0a
[ODBC][34479][1567549751.159099][SQLError.c][474]
        Exit:[SQL_NO_DATA]
[ODBC][34479][1567549751.159130][SQLFreeHandle.c][290]
        Entry:
            Handle Type = 2
            Input Handle = 0x1914060
[ODBC][34479][1567549751.159144][SQLFreeHandle.c][339]
        Exit:[SQL_SUCCESS]
[ODBC][34479][1567549751.159156][SQLFreeHandle.c][220]
        Entry:
            Handle Type = 1
            Input Handle = 0x1913750

这是我当前的odbc.ini 文件:

[ROEFDN806Q]
Description = "EOAM_RA Server"
Driver = FreeTDS
ServerName = ROEFDN806Q
Server = 10.146.186.7
Port = 1433
Database = EOAM_RA
UsageCount = 1
TDS_Version = 7.3

这是我的odbcinst.ini 文件:

[FreeTDS]
Description = "FreeTDS ODBC Driver"
Driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so

[ODBC]
Trace = yes
TraceFile = /tmp/odbctrace.txt

【问题讨论】:

  • 建议 #1:使用 Microsoft 的 ODBC Driver 17 for SQL Server 而不是 FreeTDS ODBC。
  • 你见过来自 pyodbc Wiki 的 these instructions 吗?
  • 哦,太好了!我会试试看,然后告诉你进展如何。
  • 我尝试了这些说明,在我终于让每个步骤都执行且没有错误之后,从开始到结束,我仍然遇到连接错误。在这种情况下,我收到此错误:[28000][unixODBC][Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Login failed for user 'domain\username'. [ISQL]Error: Could not SQLConnect. 其他想法?我知道我可以登录服务器,因为tsql 仍然有效。
  • 哦,所以您需要使用 Windows 凭据进行连接,是吗?

标签: ubuntu odbc pyodbc freetds unixodbc


【解决方案1】:

Microsoft 的“ODBC Driver 17 for SQL Server”是连接到 SQL Server 的首选驱动程序。但是,如果您需要将 Windows 凭据从 Linux 机器传递到 SQL Server 实例,那么您实际上需要使用 FreeTDS,至少现在是这样。

我们通过

获得所需的组件
sudo apt install tdsodbc unixodbc

然后我们使用sudo nano -w /etc/odbcinst.ini 来创建这样的条目:

[FreeTDS]
DESCRIPTION=FreeTDS ODBC driver
DRIVER=/usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so

接下来我们使用sudo nano -w /etc/odbc.ini 来创建这样的条目:

[SQLServer01]
DRIVER=FreeTDS
SERVER=192.168.0.179
PORT=49242
DATABASE=myDb
TDS_Version=7.2

最后,我们可以通过 isql 连接(注意双反斜杠):

isql SQLServer01 mydomain\\myusername mypassword

【讨论】:

  • 虽然+1,但还不起作用。问题: 1、/etc/odbc.ini/etc/odbcinst.iniusr/local/bin/isql的权限是什么? 2. 谁是这些文件的所有者? 3.odbcinst.ini中应该有Setup行吗?我确实在您提到的.so 文件旁边的正确文件夹中有一个安装文件。
  • 如果您愿意,可以将设置行添加到 odbcinst.ini,但我从不打扰它。你提到的文件应该都归root所有,root拥有rw(可​​能还有x)权限,但其他人没有w。
  • 嗯。好吧,将权限更改为八进制 744,这将给出您所描述的内容,但对解决问题没有帮助。顺便说一句,我需要isql 才能工作,很可能没有sudo 前缀。还有什么想法吗?顺便说一句,感谢您的所有帮助!这只是一个非常困难的问题。我已经用了一个多星期了。
  • 您绝对不需要 sudo 来运行 isql。回到家后我会验证权限并可以远程回到办公室。
  • 好的,看起来一切正常。那么当您尝试isql 时,ODBC 跟踪是否仍然包含“未找到数据源名称且未指定默认驱动程序”错误?
猜你喜欢
  • 2019-12-30
  • 2017-01-18
  • 1970-01-01
  • 2013-07-05
  • 2017-03-18
  • 1970-01-01
  • 1970-01-01
  • 2012-08-11
  • 1970-01-01
相关资源
最近更新 更多