SQL Server 从 Java DriverManager.getConnection() 登录失败,从 Python 使用 pymssql.connect()

Posted

技术标签:

【中文标题】SQL Server 从 Java DriverManager.getConnection() 登录失败,从 Python 使用 pymssql.connect()【英文标题】:SQL Server log in failing from Java DriverManager.getConnection(), working from Python with pymssql.connect() 【发布时间】:2017-08-30 23:23:25 【问题描述】:

我正在尝试使用 DriverManager.getConnection() 从 Java 应用程序连接到 SQL Server 数据库,但我不断收到“用户登录失败”错误。我尝试使用com.microsoft.sqlserver.jdbc.SQLServerDrivernet.sourceforge.jtds.jdbc.Driver 进行连接,但都一直遇到问题。

这是我用来连接的代码:

Class.forName("net.sourceforge.jtds.jdbc.Driver");  
conn=DriverManager.getConnection("jdbc:jtds:sqlserver://SERVERADDRESS:1433;DatabaseName=DBNAME;user=USER;password=PASS");  

我知道该帐户可以访问该数据库,因为我之前使用pymssql.connect(SERVERADDRESS, USER, PASS, DBNAME) 和相同的服务器/数据库/凭据从 Python 应用程序连接到它。

从this article 开始,我最终设法通过我的个人帐户使用 Windows 身份验证使其工作,但我仍然无法使用我们的服务帐户工作。有谁知道为什么 Python 应用可以连接,而 Java 却不能?

【问题讨论】:

当您从 Python 应用程序连接时,您是否将服务帐户用户名指定为 DOMAINNAME\USERNAME?换句话说,服务帐户是 Windows 帐户,而不是“SQL Server 身份验证”登录名吗? 我是,它正在传递domain\\svc_account。我在 Java 的连接字符串中做同样的事情。所以连接字符串是"jdbc:jtds:sqlserver://SERVERADDRESS:1433;DatabaseName=DBNAME;user=domain\\svc_account;password=PASS" 【参考方案1】:

pymssql 建立在 FreeTDS 之上。 FreeTDS 和 jTDS 都支持名为 NTLM 的旧 Windows 身份验证方案,而当前版本的 Microsoft JDBC Driver for SQL Server (mssql-jdbc) 不再支持该身份验证机制。

因此,鉴于您已确认 pymssql 可以连接,您应该能够以 Windows 用户 MYDOMAIN\username 的身份使用 jTDS 从您的 Java 应用程序进行连接,如下所示:

String myUid = "username", myPwd = "mypassword";
String connUrl = "jdbc:jtds:sqlserver://192.168.1.123:1433/databasename;DOMAIN=MYDOMAIN";
Connection conn = DriverManager.getConnection(connUrl, myUid, myPwd);

【讨论】:

祝福你善良的灵魂,成功了!【参考方案2】:

要找出“用户登录失败”的原因,应该转到 SQL Server 错误日志

18456 error 的下一行会告诉你原因。

在您的情况下,最可能的失败原因是服务器配置为使用Windows Authentication only

【讨论】:

以上是关于SQL Server 从 Java DriverManager.getConnection() 登录失败,从 Python 使用 pymssql.connect()的主要内容,如果未能解决你的问题,请参考以下文章

从 android (java) 连接到 SQL Server 2008 数据库

使用 Java 从 Oracle 服务器连接到 MS SQL Server

java - 如何在java jdbc中使用sqoop从sql server导入hive?

SQL Server 从 Java DriverManager.getConnection() 登录失败,从 Python 使用 pymssql.connect()

如何将文本文件中的数据从Java插入SQL Server?

从 Java EE 登录到 SQL Server 的最佳方式是啥