Я настраиваю кластер с 3 узлами как часть группы доступности.
Первоначально я тестировал переключение между узлами с помощью SQL Management Studio, и все прошло успешно, когда я остановил узел, и я все еще мог писать запросы.
Я начал тестировать приложение, которое подключается с помощью пользователя SQL, и всякий раз, когда я переключал узлы, я получал ошибку входа в систему.
Я считаю, что причина этой проблемы в том, что идентификаторы SID для входа на сервер, связанные с базой данных, отличаются от логинов для входа на сервер на других узлах, что привело к ошибке входа в систему. Пожалуйста, поправьте меня, если я неправильно это понимаю.
Если я правильно понимаю, как я могу гарантировать, что идентификаторы безопасности для входа на сервер одинаковы между узлами? Есть ли способ скопировать это или как это сделать?
Я немного читал об автономных базах данных, где я мог бы просто установить логин в самой базе данных, а не создавать логин на сервере, но я бы предпочел не идти по этому пути.
Ваша интуиция, скорее всего, верна. Вы можете проверить, что идентификаторы безопасности разных узлов различаются, запустив:
select name, sid from sys.server_principals
на каждом узле и сравнивая их.
Что касается того, как вы должны поддерживать их синхронизацию, сделайте это во время создания (к сожалению, я не знаю способа изменить SID постфактум). Это create login
В заявлении есть необязательный пункт для предоставления SID. Итак, я бы сделал это:
-- on node 1
create login [foobar] with password = 'str0ngp@ssword!';
select sid from sys.server_principals where name = 'foobar';
-- on subsequent nodes
create login [foobar] with password = 'str0ngp@ssword!', sid = <the sid you obtained from node 1>;
Я сделал это так, чтобы сгенерировать свой собственный SID и передать его даже для узла 1 (чтобы один и тот же сценарий выполнялся на всех серверах), но я оставляю это в качестве упражнения для читателя. :)