Ошибка входа в систему SQL Server из Java DriverManager.getConnection(), работающая из Python с pymssql.connect()

Я пытаюсь использовать DriverManager.getConnection() для подключения к базе данных SQL Server из приложения Java, но я продолжаю получать ошибки «Ошибка входа для пользователя». Я пытался использовать как 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");  

Я знаю, что у этой учетной записи есть доступ к этой БД, так как я подключался к ней раньше из приложения Python, используя pymssql.connect(SERVERADDRESS, USER, PASS, DBNAME) с тем же сервером/БД/кредитами.

Из этой статьи я в конце концов удалось заставить его работать, используя проверку подлинности Windows с моей личной учетной записью, но я все еще не могу заставить его работать, используя нашу учетную запись службы. Кто-нибудь знает, почему приложение Python может подключаться, а приложение Java - нет?


person C. Russell    schedule 30.08.2017    source источник
comment
Когда вы подключаетесь из приложения Python, вы указываете имя пользователя учетной записи службы как DOMAINNAME\USERNAME? Другими словами, является ли учетная запись службы учетной записью Windows, а не именем для входа в систему проверки подлинности SQL Server?   -  person Gord Thompson    schedule 01.09.2017
comment
Я, он проходит через domain\\svc_account. Я делаю то же самое в строке подключения в Java. Итак, строка подключения "jdbc:jtds:sqlserver://SERVERADDRESS:1433;DatabaseName=DBNAME;user=domain\\svc_account;password=PASS"   -  person C. Russell    schedule 01.09.2017


Ответы (2)


pymssql построен поверх FreeTDS. И FreeTDS, и jTDS поддерживают более старую схему аутентификации Windows под названием NTLM, в то время как текущие версии драйвера Microsoft JDBC для SQL Server (mssql-jdbc) больше не поддерживают этот механизм аутентификации.

Итак, учитывая, что вы подтвердили, что pymssql может подключаться, вы сможете подключиться из своего Java-приложения как пользователь Windows MYDOMAIN\username с помощью jTDS следующим образом:

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);
person Gord Thompson    schedule 01.09.2017
comment
Благослови вас добрая душа, которая сделала это! - person C. Russell; 02.09.2017

Чтобы выяснить причину ошибки «Вход пользователя не выполнен», необходимо зайти в журнал ошибок SQL Server.

Следующая строка до 18456 error даст вам причину.

Наиболее вероятной причиной сбоя в вашем случае является то, что сервер настроен на использование Windows Authentication only

person sepupic    schedule 31.08.2017