在工作中,我们的主要数据库之一运行在 MS SQL Server 上。我认为是 2008 年。
我目前正在 Linux 主机上通过 UnixODBC 和 FreeTDS 访问它。不幸的是,我们的管理员不支持 UnixODBC/FreeTDS,所以它落在我身上。对于长期策略,我想使用 SOAP 或 REST 调用,离开 ODBC 并切换到 HTTP。使用 HTTP 安装要容易得多,而且大多数语言都能理解它,至少是我开发的 Perl、Python 和 Ruby。
我们已经为一些 Java 进程在数据库上设置了相当数量的 SOAP 调用,所以我们可以很容易地切换到那个。我们也在讨论 REST,我喜欢它,因为它更轻量级。我们的 DBA 没有设置任何 REST 接口,所以我想知道是否有适用于 SQL Server 的插件或工具可以对表进行简单的 REST 映射,让我们快速入门。我已经考虑过用 Ruby 的 Sinatra 写一些东西,但这将是我的盘子里的另一件事。
我搜索了“SQL Server + rest”,但很明显谷歌会用“REST”这个词做错事,因此,没有找到任何有价值的东西。因此,如果您有提供 REST 的经验并觉得它是一个很好的工具,那么请加入。
在 Linux(Ubuntu 和 CentOS)上执行从 Perl/DBI/ODBC/FreeTDS 到 SQL Azure 的存储过程时出现此错误:
[unixODBC][FreeTDS][SQL Server]Read from the server failed (SQL-08S01)
Run Code Online (Sandbox Code Playgroud)
在连接到同一个 SQL Azure 数据库的 Windows(ODBC/本机)上运行相同的 Perl 脚本时,我没有收到此错误,虽然该过程需要几分钟才能运行,但它确实完成了。显然是完全不同的客户端/驱动程序环境,但它们都使用相同的 SQL Azure 数据库,并且 Perl 脚本本身没有区别。两种 Perl 环境应该相似,但显然客户端/驱动程序会有所不同。
失败的行很简单 - 一个没有参数的过程,它从临时表中获取数据并处理它 - 在 Linux 调用失败时,SQL Azure 上的环境与我从 Windows 测试调用时没有显着不同(它当临时表加载了某些数据并从 Linux 调用时,它是完全可重现的):
$dbh->do("EXEC procname;") or die $DBI::errstr ;
Run Code Online (Sandbox Code Playgroud)
我的搜索表明这是某种连接问题或超时。
我正在努力提高 proc 性能,但未在 Linux 机器上设置超时(因此应默认为 0)。
我能做些什么来阻止这个错误?
这是来自 FreeTDS 的错误运行的日志:
util.c:156:Changed query state from IDLE to QUERYING
write.c:140:tds_put_string converting 27 bytes of "EXEC DWTOOLS.LoadFromStage;"
write.c:168:tds_put_string wrote 54 bytes
util.c:156:Changed query …
Run Code Online (Sandbox Code Playgroud) 安装 FreeTDS 后,我能够使用 tsql 连接到我们的 SQL Server,但还不能通过 bsqldb。使用 bsqldb,即使 db 被指定为 testDB
.
serverName
设置在 /etc/freetds.conf
[serverName]
host = database.windows.net
port = 1433
tds version = 8.0
Run Code Online (Sandbox Code Playgroud)
使用 tsql:
[gpadmin@mdw ~]$ /usr/bin/tsql -S serverName -U user -D testDB -P password
Run Code Online (Sandbox Code Playgroud)
工作正常
使用 bsqldb,它会尝试连接到 master,即使 db 被指定为 testDB。
[gpadmin@mdw ~]$ /usr/bin/bsqldb -U user -P password -S serverName \
-D testDB -i tag.sql -o tag.csv
Msg 4060, Level 11, State 1
Server 'fj5j2jtt5k', Line 1
Cannot open database "master" requested by the …
Run Code Online (Sandbox Code Playgroud)