У меня есть 3 машины, которые вовлечены в запущение скрипта SQL:
Поскольку 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 ко всем соответствующим базам данных и всем 3 из серверов, таким образом, я не уверен, почему он теряет контекст при попытке использовать Связанный сервер. Все три из машин находятся на том же домене и находятся на самом деле даже в той же подсети (таким образом, они аутентифицируют использование того же 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.