
Вчера весь день я провёл, пытаясь подключиться к локальной базе данных на MS SQL Server, но это опять больше напоминало какой-то квест (как во многих моментах в программировании): как только одна небольшая задачка оказывалась решена, впереди оказывалась ещё одна – не менее непонятная. В итоге я всё же справился и с сервером, и с кодом в Идее, поэтому решил законспектировать свои успехи.
Мне нужно было запустить у себя на компьютере приложение, которое уже неплохо работало на удалённом сервере. Для этого я был готов собрать проект из исходного кода, но для корректной работы необходимо было ещё и продублировать базу данных. Я поставил SQL Server, восстановил базу из дампа с рабочего сервера (правой кнопкой по Databases -> Restore Database -> в Device выбрать нужный файл с компьютера), но дальше всё не шло так уж гладко. Залогиниться из среды Intellij Idea не выходило, собранное приложение этого тоже не могло делать, поэтому просто крашилось при запуске. Тут я подумал, что наверно следовало бы настроить MS SQL Server – просто поставить его недостаточно.
Я статью начну с описания того, что следовало бы сделать изначально – как всё настроить, чтобы всё сразу работало, а потом уже перейду к ошибкам, которые я получал, потому что так не сделал.
Настройка SQL Server Configuration Manager
Такая проблема решается настройкой в Configuration Manager. Найти его можно по адресу C:\Windows\SysWOW64\SQLServerManager14.msc (мой менеджер для SQL Server 2017, для боле новой версии 2019 был бы SQLServerManager15, для старой – SQLServerManager11-13, но всё в той же папке).

Здесь нужно развернуть пункт меню SQL Server Network Configuration, выбрать нужную конфигурацию (у меня это SQLEXPRESS) и убедиться, что TCP/IP включён (Enabled) – исправить ситуацию можно правой кнопкой мыши – Enable.
Далее нужно просмотреть свойства (двойное нажатие мыши), убедиться, что на вкладке Prototocol -> Listen All – Yes, а на вкладке IP Adresses в самом низу в IPAll записан порт 1433.

Вообще порт можно выбрать и другой, но я в своей конфигурации остаюсь со стандартным вариантом.
Настройка в SQL Server Management Studio
Дла начала нужно создать юзера. Для этого я подключился к базе с проверкой подлинности Windows в навигаторе слева выбрал Security -> Logins -> щелчок правой кнопкой -> New Login.

В этом окне создаём логин с аутентификации SQL Server Authentication. Далее всё довольно просто: Login Name – имя пользователя, в password – его пароль. Снять галочку с Enforce password security policy и всё – готово.

Далее нужно отредактировать роли этого нового юзера (или уже существующего, если у вас уже есть логин и пароль, но с ними что-то идёт не так). Для этого в папке Logins выбираем эту новосозданную запись -> щелчок правой кнопкой -> Properties. На вкладке Server Roles отмечаем нужные роли. Я ткнул sysadmin, чтобы всё уж точно работало.

Ну и чтобы после всех этих настроек всё работало корректно, нужно перезапустить сервер. Я даже перезапустил службу SQL Server (SQLEXPRESS). Но вообще для остановки или запуска сервера можно и вбить в командной строке (конечно же от имени администратора):
net {stop|start} mssqlserver
Проверьте, работает ли новый логин, отключившись и подключившись заново уже с новым типом аутентификации.

Если вы всё ещё получаете ошибку Microsoft SQL Server Error: 18456, или то проверьте, включена ли вообще аутентификация по логину и паролю. Правой кнопкой по экземпляру SQL Server -> Properties -> Security -> выберите SQL Server and Windows Authentication Mode. Также это должно решить проблему 233:
A connection was successfully established with the server, but then an error occurred during the login process
Error Number: 233
Теперь всё должно работать и можно подключаться к базе с помощью логина и пароля. Ну и дальше можно уже организовать подключение из IDE.
Подключение из Intellij Idea с помощью Windows Credentials
Для начала я решил проверить соединение с базой из Intellij Idea. Чтобы его создать нужно перейти в панель Database (у меня она справа, но также выбрать её можно через меню View -> Tool Windows -> Database). Нажимаем на плюсик и создаём новый источник (Data Source), у меня это Microsoft SQL Server с какой-то непонятной иконкой.

Внутри заполняем все нужные данные.
Название хоста – в моём случае название моего компьютера,
в Instance – SQLEXPRESS (или может у вас MSSQLSERVER?)
Стандартный порт 1433.
В Authentication выбираем Windows Credentials – начинаем с простого.
Database весьма очевидное поле – имя базы данных.

Не забудьте переключить драйвер на Microsoft SQL Server (jTds) – обычный Microsoft почему-то у меня работает некорректно (и, судя по stackoverflow, не у меня одного).
Ошибки подключения из Intellij Idea
Вроде бы всё должно работать, но при моих попытках подключиться из Intellij Idea я получал следующее сообщение об ошибке:
[08S01] The TCP/IP connection to the host localhost, port 1433 has failed. Error: "Connection timed out: no further information.. Verify the connection properties. Make sure that an instance of SQL Server is running on the host and accepting TCP/IP connections at the port. Make sure that TCP connections to the port are not blocked by a firewall.".
Такая проблема решается настройкой в Configuration Manager (см выше — первый пункт).
Подчеркну, что я сначала создавал подключение, а лишь потом кинулся всё настраивать, поэтому я имел несчастье наблюдать эти ошибки. После настройки эта проблема разрешилась. Поэтому, если вы начали с настройки, то у вас этой проблемы быть и не должно.
Но далее у меня вылезла новая ошибка:
[08S01] The driver could not establish a secure connection to SQL Server by using Secure Sockets Layer (SSL) encryption. Error: "PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target". ClientConnectionId:9a5.......
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target.
С безопасностью я в принципе мало дружу, но гугл подказал, что всего лишь нужно в URL добавить пару новых параметров: encrypt=true и trustServerCertificate=true.
Тогда строка для подключения (URL) получилась такой:
jdbc:sqlserver://MYCOMPUTER\SQLEXPRESS:1433;database=db_example;encrypt=true;trustServerCertificate=true
И теперь в Intellij Idea я мог спокойно подключаться к базе с помощью Windows Credentials.
Подключение из Intellij Idea с помощью User & Password Authentication
Здесь настройка почти ничем не откличается. Только выбираем другой тип аутентификации и вводим логин и пароль, который недавно создавали (см. выше – Настройка в SQL Server Management Studio).

После этого можно жамкнуть Test Connection, чтобы убедиться, что всё работает.
Вот и всё! Всё должно работать. Теперь можно засунуть это подключение в Hibernate.
<hibernate-configuration>
<session-factory>
<property name="connection.driver_class">net.sourceforge.jtds.jdbc.Driver</property>
<property name="connection.url">jdbc:jtds:sqlserver://SALINGER:1433/db_example;instance=SQLEXPRESS;encrypt=true;trustServerCertificate=true</property>
<property name="connection.username">admin</property>
<property name="connection.password">{HIDDEN } </property>
<property name="connection.pool_size">100</property>
<property name="dialect">org.hibernate.dialect.SQLServerDialect</property>
<...>
</session-factory>
</hibernate-configuration>
Надеюсь эта статья кому-то помогла избежать мучений, какие я испытывал, гугля каждую из ошибок в уверенности, что вот теперь-то всё будет работать.
Очень помогла статья, решил проблему.
НравитсяНравится