SQL 从 Java DriverManager.getConnection() 开始服务器登录失败,从 Python 使用 pymssql.connect()

SQL Server log in failing from Java DriverManager.getConnection(), working from Python with pymssql.connect()

我正在尝试使用 DriverManager.getConnection() 从 Java 应用程序连接到 SQL 服务器数据库,但我一直收到 "Login failed for user" 错误。我试过同时使用 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 应用程序连接到它,同样 server/DB/creds.

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

要找出 "Login failed for user" 的原因,应该去 SQL 服务器 错误日志

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

在您的案例中,最可能的失败原因是服务器配置为使用 Windows Authentication only

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