4

sp_addlinkedserverを使用してリンクされた2つのリンクされたSQLServer間で分散トランザクションを実行できるという概念実証をテストしようとしています。名前はServer1とServer2で、どちらもデフォルトのインスタンスで実行されます。各サーバーは、それぞれソースと宛先の単一のデータベースを保持し、宛先データベースは、出力と呼ばれる単一のテーブルを保持します。

Server1.Source
Server2.Destination.Output

OUTPUTテーブルの構造は次のとおりです。

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

Server1から、sp_addlinkedserver'Server2'を呼び出して2つのデータベースをリンクし、次のクエリを実行して、リンクが実際に機能することをテストしようとしました。

Select   *
From     Server2.Destination.dbo.Output

次の例外が返されます。

ログインマッピングが存在しないため、リモートサーバーへのアクセスが拒否されます。

十分に公平なので、Server1からsp_addlinkedsrvlogin'Server2'を実行します。これは、ドキュメントによると、クエリをリモートで(つまり、Server1から)実行するユーザーのユーザー資格情報を取得し、それらの資格情報をServer2に適用する必要があると述べています。これは、Windows認証を使用してServer1に接続しているため、Windows資格情報がServer2にも適用されることを意味します。

これで、例外メッセージは次のように変わります。

ユーザー'NTAUTHORITY \ANONYMOUSLOGON'のログインに失敗しました。

この例外をグーグルで検索して、私は正しい方向に私を向ける有用なものを何も思いつきませんでした。私は何が欠けていますか?[ログインがまったく失敗した場合]例外として、匿名のログオン資格情報ではなく Windows資格情報を参照することを期待します。

リンク自体が機能するようになると、分散トランザクション自体はかなり単純なものになるはずです-ドキュメントは、DTCサービスがServer1で実行されていること、およびトランザクションされるクエリがServer1で実行されていることを確認する必要があることを示していますリンク全体:

  • 分散トランザクションを初期化する前に、SETXACT_ABORTONを含めます
  • BEGINTRANSACTIONの代わりにBEGINDISTRIBUTEDTRANSACTIONを使用します
  • Server2上のSQLServerのデフォルト以外のインスタンスを参照する場合は、クエリ内のServer2という名前のインスタンスを[Server2\InstanceName]に置き換えます。

私の質問は次のとおりです。

  • このログインの問題を回避するにはどうすればよいですか?sp_addlinkedsrvloginストアドプロシージャだけではうまくいかないようです。
  • ドキュメントが示すように、分散トランザクションを実行するのと同じくらい簡単ですか?

TIA

4

2 に答える 2

1

ドメインにいる場合、設定は「ログインの現在のセキュリティ コンテキストを使用して作成する」にする必要がありますが、もう 1 つの手順があります。トランザクションに関与する各サーバーに SPN を付与する必要があります。

両方のサーバーでドメイン ユーザーとして SQL サービスを実行していると仮定すると (これを機能させるにはこれが必要です - LocalSystem では実行されません)、必要な手順は次のとおりです。

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

ユーザーには両方のサーバーの SPN が必要ですが、クライアントの SPN は必要ないことに注意してください。たとえば、クライアント -> サーバー 1 -> サーバー 2 の順に移動する場合、SQL サービス アカウントにはサーバー 1 とサーバー 2 の両方の SPN が必要です。

混乱している場合 (紛らわしいプロセスです)、コメントを投稿してください。説明を明確にします。

于 2009-01-16T18:14:03.663 に答える
0

これらのサーバーが両方とも同じドメイン上にあると仮定します-サーバーがターゲットサーバーに資格情報を渡すことを許可するために、信頼できる委任を有効にしましたか?サーバーのActiveDirectoryオブジェクトをプルアップし、[委任]タブに移動して、[指定したサービスへの委任についてのみこのコンピューターを信頼する]を選択し、サーバーが資格情報を渡すことを許可されているSQLServerの詳細を入力します。

サービスタイプ=MSSQLSvc
ユーザー/コンピューター=YourTargetServer.Your.Domain
ポート=1433

残念ながら、リンクサーバーでのこれらのタイプの認証の問題の多くは、完全に有効にするために再起動が必要です(したがって、これらが実稼働サーバーである場合、日中のトラブルシューティングは困難です)。

分散トランザクションに関しては、最終的にリンクサーバー接続が正しく稼働するようになれば、分散トランザクションはうまく機能します。動作を開始すると次に遭遇する可能性があるのは、リンクされたデータベースに何かを挿入した後、SCOPE_IDENTITY()、@@IDENTITYなどの形式を使用して主キーを取得できないという大きな欠陥を見つけることです。 。しかし、それはそれ自身の楽しい回避策に関する別の問題です...

于 2009-01-16T17:59:00.727 に答える