Unable to execute a remote stored procedure over a linked server で解説されている内容と類似のものとなりますが、レプリケーションを使用している環境でも同様の事象が発生する可能性があります。
レプリケーションで自動作成されたリンクサーバーを使用した際のエラー
レプリケーションを設定すると、サブスクライバーに指定したサーバーのリンクサーバーの作成が行われています。
「サブスクライバー」が「True」となっており、レプリケーションで必要となるデータアクセスが許可された状態のリンクサーバーが作成されている状態となっています。
「データ アクセス」を「True」に変更することで、このリンクサーバー名を使用して、リモートサーバーのデータにアクセスを行うことが可能となりますが、このリンクサーバーを使用してストアドプロシージャを実行しようとすると、冒頭に記載した記事のエラーが発生します。
メッセージ 18485、レベル 14、状態 1、行 5
サーバー ‘NUC-102’ に接続できませんでした。このサーバーは、リモート ログインを許可するように構成されていません。
リモート アクセスの構成オプションを使用して、リモート ログインを許可してください。
冒頭の記事では「sysservers の isremote = 1」の場合に、実行がエラーとなっており、レプリケーション設定時に作成されたリンクサーバーもこの事象と同様に「isremote=1」となっています。
「sysservers」は下位互換のシステムビューとなり、最新のシステムビューは「sys.servers」となります。
sys.servers で情報を確認した場合、該当のリンクサーバーは「is_linked=0」として設定が行われた状態となっています。
ドキュメントからこの設定の内容を確認すると次の記載があります。
「is_linked = 0」は古いスタイルのリンクサーバーとなるようで、今回のようなリモートでのストアドプロシージャの実行に問題が出ているようです。
この現象を回避する方法ですが次のような対応が考えられるのではないでしょうか。
- レプリケーションを解除して既存のリンクサーバーを削除し、新しくサブスクライバー名でリンクサーバーを事前に作成した後に、レプリケーションを設定する
- 新しいリンクサーバーを作成してそのリンクサーバーでリモートのストアドプロシージャを実行
リンクサーバーを再作成することによる対応
「1.」については、レプリケーションの設定を削除する必要がありますが、削除できるのであればこの方法が活用できます。
サブスクライバーの登録時にはリンクサーバーが作成されますが、すでにサブスクライバー名のリンクサーバーが作成されている場合は、そのリンクサーバーに対してレプリケーション向けの設定が行われます。
レプリケーションの作成前に、事前に作成しておいたリンクサーバーは次のような状態となっています。
この状態ではリンクサーバー向けの設定は False となっています。
この状態で、サブスクライバーとして該当のサーバーを登録すると、既存のリンクサーバーに対してレプリケーションの設定が有効化 (サブスクライバー = True) されています。
このリンクサーバーについては、レプリケーションで作成したものではなく、手動で作成したものとなりますので「is_linked=1」となっています。
レプリケーションで作成されたものと異なり、RCP の設定が False となっていますので、True に変更しておきます。
USE [master] GO EXEC master.dbo.sp_serveroption @server=N'NUC-102', @optname=N'rpc', @optvalue=N'true' GO EXEC master.dbo.sp_serveroption @server=N'NUC-102', @optname=N'rpc out', @optvalue=N'true' GO
これで、レプリケーションでも使用されるリンクサーバーでストアドプロシージャを実行することが可能となります。
新しいリンクサーバーを作成することによる対応
レプリケーションの設定を削除することができない場合は、新しいリンクサーバーを作成することによる対応を検討する必要があります。
この場合、リンクサーバー名が変わってしまうことは回避できませんが、既存設定の削除は不要となりますので影響を抑えることができるかと。
新しいリンクサーバー名の指定については「別名」を活用することができます。
リンクサーバーを作成する場合、サーバー名を使用して作成することが多く、レプリケーションを設定する際にもサーバー名で設定を行うため、リンク先の物理サーバー名は既にリンクサーバーとして登録されているため再利用をすることができません。
IP を直接指定することや、hosts 等の名前解決で IP を別名として解決させることで、同一サーバーに対して複数のリンクサーバーを作成することが可能ですが、別名も活用できることを覚えておくとよいのではないでしょうか。