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