Как настроить аутентификацию между связанными серверами? - PullRequest
4 голосов
/ 16 января 2009

Я пытаюсь проверить концепцию того, что я могу запустить распределенную транзакцию на двух связанных SQL-серверах, связанных с помощью sp_addlinkedserver - их имена - Server1 и Server2, оба работают под экземплярами по умолчанию. Каждый сервер содержит одну базу данных, Source и Destination соответственно, а база данных назначения содержит одну таблицу с именем Output, т.е.

Server1.Source
Server2.Destination.Output

Таблица OUTPUT имеет следующую структуру:

OUT_PKEY int identity(1,1) primary key,
OUT_TEXT nvarchar(255)

С сервера Server1 я позвонил sp_addlinkedserver 'Server2' , чтобы связать две базы данных, и я попытался выполнить следующий запрос, чтобы проверить, действительно ли ссылка работает:

Select   *
From     Server2.Destination.dbo.Output

Мне возвращается следующее исключение:

Доступ к удаленному серверу запрещен, поскольку не существует сопоставления для входа.

Достаточно справедливо, поэтому с сервера Server1 я запускаю sp_addlinkedsrvlogin 'Server2' , который согласно документации говорит, что он должен принять учетные данные пользователя, который выполняет запрос удаленно (т. Е. С Server1), и применить эти учетные данные на сервер2. Это подразумевает, что, поскольку я подключен к Server1 с использованием аутентификации Windows, это должно означать, что мои учетные данные Windows также применяются к Server2.

Теперь сообщение об исключении меняется на:

Ошибка входа для пользователя 'NT AUTHORITY \ ANONYMOUS LOGON'.

Погуглив это исключение, я не нашел ничего полезного, что бы указывало мне правильное направление. Что мне не хватает? Я ожидаю, что [в случае неудачного входа в систему] исключение будет ссылаться на мои учетные данные Windows, , а не на учетные данные анонимного входа.

Похоже, что после того, как я получу работающую ссылку, сами распределенные транзакции должны быть довольно простым делом - документация подразумевает, что мне просто нужно убедиться, что служба DTC работает на сервере Server1 и что любые запросы выполняются на сервере Server1, которые будет осуществляться через ссылку:

  • Включить УСТАНОВИТЬ XACT_ABORT ON до инициализации моей распределенной транзакции
  • Я использую НАЧАЛО РАСПРЕДЕЛЕННОЙ СДЕЛКИ вместо НАЧАЛО СДЕЛКИ
  • Если я хочу сослаться на экземпляр SQL Server не по умолчанию на Server2, я заменяю любые экземпляры имени Server2 в моем запросе на [Server2 \ InstanceName]

Вот мои вопросы:

  • как мне пройти эту проблему с логином? Кажется, что хранимая процедура sp_addlinkedsrvlogin сама по себе не помогает.
  • Действительно ли так просто запустить распределенную транзакцию, как предполагает документация?

ТИА

Ответы [ 2 ]

1 голос
/ 16 января 2009

Если вы находитесь в домене, то параметр должен быть «Выполнен с использованием текущего контекста безопасности входа в систему», но есть еще один шаг - вам нужно предоставить имя участника-службы каждому из серверов, участвующих в транзакции.

Предполагая, что вы запускаете службы SQL на обоих серверах в качестве пользователя домена (что необходимо для того, чтобы эта работа работала - LocalSystem этого не сделает), вот инструкции, которые вам понадобятся:

http://technet.microsoft.com/en-us/library/bb735885.aspx

Помните, что пользователю потребуется имя участника-службы для обоих серверов, но не клиент - например, если вы переходите от клиента -> сервер1 -> сервер2, учетной записи службы SQL потребуется имя участника-службы как для сервера1, так и для сервера2.

Если вы запутались (это запутанный процесс), оставьте комментарий, и я уточню инструкции.

0 голосов
/ 16 января 2009

Предполагая, что оба сервера находятся в одном домене - вы включили доверенное делегирование, чтобы позволить вашему серверу передавать учетные данные целевому серверу? Вы должны открыть объект Active Directory для сервера и перейти на вкладку «Делегирование» и выбрать «Доверять этот компьютер для делегирования только указанным службам», а затем ввести сведения о SQL Server, которым серверу разрешено передавать учетные данные:

Тип сервиса = MSSQLSvc
Пользователь / Компьютер = YourTargetServer.Your.Domain
Порт = 1433

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

Что касается распределенных транзакций - если вы в конечном итоге подключите сервер к соединению и будете работать правильно, то распределенные транзакции будут отлично работать. Хотя следующая вещь, с которой вы, вероятно, столкнетесь, когда начнете работать, это обнаружение огромного недостатка , что вы не можете использовать любую форму SCOPE_IDENTITY (), @@ IDENTITY и т. Д. Для получения первичных ключей после вставить что-то в связанную базу данных. Но это еще одна проблема с ее собственными забавными обходными путями ...

...