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