Назад | Перейти на главную страницу

Использование связанных серверов SQL с другого сервера

У меня есть 3 машины, которые участвуют в выполнении сценария SQL:

  1. JumpBox - машина, которая служит стабильной точкой для запуска автоматизации.
  2. ReportBox - машина, которая содержит базы данных и логику отчетов. Запуск SQL Server 2008 R2
  3. OLTPBox - компьютер, содержащий базу данных OLTP. Запуск SQL Server 2014

Поскольку OLTPBox - нестабильная тестовая среда (она регулярно разрушается и перестраивается), нам нужно проделать как можно больше работы вне этого контекста. Итак, у меня есть сценарий SQL (назовите его InsertScript.sql), который в основном делает следующее:

INSERT INTO testresults VALUES (SELECT * from OLTPBox.prod.dbo.results)

OLTPBox в скрипте - это связанный сервер.

Приведенный выше сценарий заключен в вызов SQLCMD, который выполняется в JumpBox:

SQLCMD -i .\InsertScript.sql -S ReportBox -D Reporting

Однако когда я запускаю это, я получаю следующую ошибку:

Msg 18456, Level 14, State 1, Server OLTPBox, Line 1 Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'.

Контекст, который я использую в JumpBox, существует как DBO для всех соответствующих баз данных и всех трех серверов, поэтому я не уверен, почему он теряет контекст при попытке использовать связанный сервер. Все три машины находятся в одном домене и фактически даже находятся в одной подсети (поэтому они аутентифицируются с использованием одного и того же DC).

Что здесь происходит, почему теряется контекст входа в систему?

Убедитесь, что вы установили свои SPN на всех задействованных серверах SQL.

Обычно я делаю следующее:

setspn –A MSSQLSvc/myservername.fqdn:instancename DOMAIN\SQLServiceAccount
setspn –A MSSQLSvc/myservername.fqdn:port DOMAIN\SQLServiceAccount
setspn –A MSSQLSvc/myservername:instancename DOMAIN\SQLServiceAccount
setspn –A MSSQLSvc/myservername:port DOMAIN\SQLServiceAccount

Это должно уловить большинство возможных способов подключения

Вы можете проверить, работает ли он, взглянув на sys.dm_exec_connections стол. Искать Kerberos под auth_scheme. Это может занять несколько минут, если не попробовать перезапустить службы, подключающиеся к вашему SQL.