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.SQLServerDriver
和net.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()